利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题
问题的描述:
一个项目,涉及到了 两个数据源,分别使用的是 两个不同的 数据库连接池,其中一个是 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:
<bean id="dataSource"
class="org.logicalcobwebs.proxool.ProxoolDataSource">
改为:
<bean id="dataSource"
class="org.logicalcobwebs.proxool.ProxoolDataSource" init-method="getConnection">
就OK了,会强制 org.logicalcobwebs.proxool.ProxoolDataSource 在实例化时,立即调用 getConnection方法,立即初始化好数据库连接。
避免直到第一次访问数据库时,才临时去初始化数据库连接池,从而导致的首次访问超级慢的问题。
这样配置的话,会导致另一个小小的问题,启动时,会变慢一点,因为启动时,需要出事化两个数据库连接池中的数据库连接。
关于 init-method的原理,可以参考我的另一篇博客:http://www.cnblogs.com/digdeep/p/4518571.html
利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题的更多相关文章
- 1-3 Spring Bean 的属性值设置
详见http://www.cnblogs.com/chenssy/archive/2013/03/17/2964593.html 1.注入普通的属性值 <bean id="Cat&qu ...
- spring bean parent属性详解
必要条件:1.子bean必须与父bean保持兼容,也就是说子bean中必须有父bean定义的所有属性. 2.父bean必须是抽象bean或者定义lazy-init=true也就是不让bean工厂实例化 ...
- spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)
这里不介绍原理,只是记录自己spring+cxf的开发过程和遇到的问题 场景:第三方公司需要调用我们的业务系统,以xml报文的形式传递数据,之后我们解析报文存储到我们数据库生成业务单据: WebSer ...
- 利用反射操作bean的属性和方法
今天在开发中碰到这样一个场景:当请求添加项目下的目录时,传过来的是一个IndexModel,这个Model里有关于这个目录字段的详细信息,包括基础报表,实时,漏斗等信息(这些字段类型都是boolean ...
- spring init method destroy method
在java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等等. ...
- Spring - <bean parent="xxx" 属性>
总结 必要条件: 1.子bean必须与父bean保持兼容,也就是说子bean中必须有父bean定义的所有属性. 2.父bean必须是抽象bean或者定义lazy-init=true也就是不让bean工 ...
- java代码中init method和destroy method的三种使用方式
在java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等等. ...
- Spring学习(十二)-----Spring Bean init-method 和 destroy-method实例
实现 初始化方法和销毁方法3种方式: 实现标识接口 InitializingBean,DisposableBean(不推荐使用,耦合性太高) 设置bean属性 Init-method destroy- ...
- Spring Bean init-method 和 destroy-method实例
在Spring中,可以使用 init-method 和 destroy-method 在bean 配置文件属性用于在bean初始化和销毁某些动作时.这是用来替代 InitializingBean和Di ...
随机推荐
- 关于一道PHP面试题的解法
参照一个int型数组,如int[] a1=new int[]{10,9,10,20,15,3,9,8,7,1,1},编写一个方法,要求输出不重复,且降序的拼接字符串(连接字符用逗号),如上数组,输出的 ...
- 使用CodeDom动态生成类型
.NET 3.5的时候加入了匿名类型这个特性,我们可以直接使用 new {name="abc"} 来直接生成一个对象.这个特性现在应用的地方很多,比如dapper的查询参数都是用匿 ...
- 多说使用ua-parser-js显示浏览器和系统信息
前言 昨天博客接入了评论系统,使用的是国内的多说. 之前看到过有些利用该评论系统的有浏览器和系统信息的显示,感觉很不错. 所以,也想有这样的效果. 问题 多说如何显示浏览器和系统的信息? 解决方法 经 ...
- linux使用心得(持续更新)
! 查看发行版本信息 lsb_release -a uname -a 以下方法只适合redhat和centos cat /etc/redhat-release rpm -q redhat-rele ...
- swift相关
1.界面上一个输入框,一个按钮,一个webview .点按钮,webview显示输入框中输入的url的页面. @IBOutlet var wv:UIWebView = nil //定 ...
- [修正] Firemonkey TSelection 控件等比缩放时,左下角拉动问题
说明:TSelection 控件,当在属性 Proportional = True 为等比缩放时,拉动左下角,右上角会跟着移动. 适用:Berlin 10.1.1 (或之前版本) Firemonkey ...
- 25M时钟的梁祝演奏
module liangzhu(clk_50M,rst,speaker); input clk_50M,rst; output speaker; reg speaker; //分频计数器paramet ...
- android raw和assets的区别
*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1**.res/raw中的文件会被映 ...
- 设计模式学习之路——Decorator装饰模式(结构模式)
子类复子类,子类何其多 假如我们需要为游戏中开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能:比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等. 动机 ...
- 转移博客到xinqiyang.freeflare.com了,这里会继续更新.
hi.... 欢迎大家来到这里,这里将转移到github page搭建的博客 http://xinqiyang.freeflare.com 了,现在习惯于实用markdown来写东西了,这样可以脱离浏 ...