博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题...
阅读量:5894 次
发布时间:2019-06-19

本文共 1551 字,大约阅读时间需要 5 分钟。

问题的描述:

一个项目,涉及到了 两个数据源,分别使用的是 两个不同的 数据库连接池,其中一个是 poxool 连接池,问题在于,spring在启动时,只初始化其中的一个 数据库连接池中的数据库连接,而 poxool配置的数据库连接池,在启动时 没有进行初始化,一个数据库连接也没有初始化好,所以导致了首次需要 访问数据库时,临时需要进行数据库连接的初始化,导致了首次点击页面按钮时,如果是远程访问,最多需要15秒左右。

一开始以为可以在 dataSource 这个bean 上使用属性 lazy-init = "false" 来搞定,其实默认就是 lazy-init="false",其实从 spring 的启动日志来看,poxool 对应的 dataSource已经实例化了,所以不是 dataSource 延迟初始化的问题,而是 dataSoruce 实例化了,但是其中的 数据库连接却没有初始化,所以这才是问题的根本原因。

找到了原因,那么解决起来就容易了,我们知道 bean 有个属性: init-method ="someMethod",表示在实例化 bean的后期阶段,调用 该 bean 的 someMethod 方法。

所以,我们查看 org.logicalcobwebs.proxool.ProxoolDataSource 的源码,找到他的初始化数据库连接的 方法,赋值该 init-method 属性就可以搞定了。源码如下:

/**     * @see javax.sql.DataSource#getConnection()     */    public Connection getConnection() throws SQLException {        ConnectionPool cp = null;        try {            if (!ConnectionPoolManager.getInstance().isPoolExists(alias)) {                registerPool();            }            cp = ConnectionPoolManager.getInstance().getConnectionPool(alias);            return cp.getConnection();        } catch (ProxoolException e) {            LOG.error("Problem getting connection", e);            throw new SQLException(e.toString());        }    }

很显然,getConnection 会触发了 org.logicalcobwebs.proxool.ProxoolDataSource 建立数据库连接。

所以将 bean:

改为:

就OK了,会强制 org.logicalcobwebs.proxool.ProxoolDataSource 在实例化时,立即调用 getConnection方法,立即初始化好数据库连接。

避免直到第一次访问数据库时,才临时去初始化数据库连接池,从而导致的首次访问超级慢的问题。

 

这样配置的话,会导致另一个小小的问题,启动时,会变慢一点,因为启动时,需要出事化两个数据库连接池中的数据库连接。

 

关于 init-method的原理,可以参考我的另一篇博客:http://www.cnblogs.com/digdeep/p/4518571.html

 

你可能感兴趣的文章
Confluence 6 重要缓存和监控
查看>>
Day 30 shell 编程
查看>>
静态路由和默认路由
查看>>
谈一谈Spring-Mybatis在多数据源配置上的坑
查看>>
2.1 shell语句
查看>>
【精益生产】车间现场管理的八大浪费
查看>>
springMVC国际化
查看>>
变频电源内部的元器件是有着什么样的发挥和作用
查看>>
关于阿里开发者招聘节 |这5道笔试真题 你会吗!???
查看>>
C#的异常处理机制
查看>>
写给MongoDB开发者的50条建议Tip13
查看>>
vsftp:500 OOPS: could not bind listening IPv4 sock
查看>>
Linux安装BTCPayServer并设置比特币BTC和Lightning支付网关
查看>>
Python 的 with 语句
查看>>
elasticsearch学习——环境搭建2
查看>>
mysql安装,远程连接,以及修改密码
查看>>
Mybatis查询返回Map类型数据
查看>>
java的深拷贝与浅拷贝
查看>>
程序员如何提高工作效率
查看>>
数据库水平切分(其他应用)
查看>>