利用 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 ...
随机推荐
- 做图表统计你需要掌握SQL Server 行转列和列转行
说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...
- 多步骤多分步的组件StepJump
最近的工作在做一个多步骤多分步的表单页面,这个多步骤多分步的意思是说这个页面的业务是分多个步骤完成的,每个步骤可能又分多个小步骤来处理,大步骤之间,以及小步骤之间都是一种顺序发生的业务关系.起初以为这 ...
- C#正则表达式Regex常用匹配
使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...
- 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误
本文转载自: http://www.cnblogs.com/JiaoWoWeiZai/p/5892255.html 最近DotNetCore更新到了1.0.1,Azure tools也更新到了2.9. ...
- html的留言板制作(js)
这次留言板运用到了最基础的localstorage的本地存储,展现的效果主要有: 1.编写留言2.留言前可以编辑自己的留言昵称.不足之处: 1.未能做出我喜欢的类似于网易的叠楼功能. 2.未能显示评论 ...
- svn中cleanup作用
我们开发项目的时候,用版本控制软件svn提交项目时候难免会遇到cleanup,那么这个提示是怎么产生的呢?它有什么作用呢? 产生原因:SVN 本地更新时,由于一些操作中断更新,如磁盘空间不够,用户取消 ...
- Home / Python MySQL Tutorial / Calling MySQL Stored Procedures in Python Calling MySQL Stored Procedures in Python
f you are not familiar with MySQL stored procedures or want to review it as a refresher, you can fol ...
- 转载:《TypeScript 中文入门教程》 7、模块
版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变 ...
- [moka同学笔记]五、Yii2.0课程笔记(魏曦老师教程)[审核功能]
- 解决eclipse配置Tomcat时找不到server选项(Mac通用)
集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在Eclipse中,窗口(window)——首选项(preferences)——服务器(Server)——运行时环境( ...