公司新项目上线,需要从老数据库中定时同步部分数据到新数据库中,写了一个调度程序来做。
运行一段时间后发现,调度程序的连接池一直在不停增长,大概8个小时能增加600-800个连接,等到连接数量达到连接上设置的上限后,程序就开始一直等待不工作了。
刚开始以为是连接池配置问题,调了好几个方案,问题没有解决,就怀疑到了是代码里事务的问题,这下就不好办了,因为项目中混合使用了hibernate和jdbcTemplate,而且方法也不少,具体定位很麻烦(本人巨懒)。
刚好前几天在新项目中用了JavaMelody监控性能,那就还试试用这个工具来找原因吧.
JavaMelody的安装方法另一个文章了已经写了,[url]http://henghengdh.iteye.com/blog/1967755[/url],但是想要监控到jdbc连接,还要单独配置下连接池。
因为调度程序同时使用了hibernate和jdbcTemplate,那么另一篇文章里的单纯hibernate配置就不管用了,需要配置jndi的方式。
[b]第一步,在tomcat的server.xml中,在GlobalNamingResources标签中添加jndi数据源。 [/b]
type="com.mchange.v2.c3p0.ComboPooledDataSource"
maxPoolSize="1000"
minPoolSize="10"
acquireIncrement="5"
initialPoolSize="10"
maxIdleTime="60"
factory="org.apache.naming.factory.BeanFactory"
user="sa"
password="123"
driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbcUrl="jdbc:sqlserver://192.168.32.111:1433;databaseName=sms"
idleConnectionTestPeriod="60" />
[b]第二步,将配置的数据源放入tomcat的context.xml中,以供tomcat全局调用。[/b]在context节点中,添加
[b]第三步,在项目的spring配置文件中,引入jndi数据源。[/b]
在applicationContext.xml中添加
java:comp/env/jdbc/dataSourceOld
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
${hibernate.dialect}
${hibernate.show_sql}
${hibernate.format_sql}
[b]最后,将c3p0和sql2005的jar包放入tomcat的lib文件夹里(用其他连接池和数据库的放对应的jar包),然后按照[url]http://henghengdh.iteye.com/blog/1967755[/url]的JavaMelody安装方法把JavaMelody加入项目中。[/b]
到这里,项目和JavaMelody已经配置好了,启动项目,在JavaMelody监控台里添加项目地址就能看到项目的运行状态了。
[img]http://dl2.iteye.com/upload/attachment/0090/9482/717a2c6b-0c5c-3fee-87ff-de8cc505cb68.png[/img]
如上图被使用的jdbc连接数,最高达到了311,因为调度程序基本不会有并发的情况,所以我给调度程序设置的连接上线是50个,这肯定就是有连接没有释放了,然后往下看系统信息这里
[img]http://dl2.iteye.com/upload/attachment/0090/9484/e7d7624e-9a30-3e5c-9ea0-f06f3d364a3b.png[/img]
点击红圈圈住的地方,出现下图
[img]http://dl2.iteye.com/upload/attachment/0090/9486/dd94ef01-ba6d-393f-8b8c-8f25c5e8ad6f.png[/img]
这里就是所有正在使用的连接了,鼠标放到时间出,可以看到详细信息,如下图
[img]http://dl2.iteye.com/upload/attachment/0090/9217/f5f17685-eb78-3c06-9afc-5fc04a34e4bf.png[/img]
红圈处定位到了具体的类和方法,剩下的问题就好说了,改方法就是了。
最后的方法问题。。。。不想说了。。。n+1次的倒在了opensession()和getCurrentSession()前面。。。
修改完方法后重启项目,再进入“被打开的JDBC连接数”页面,如下图
[img]http://dl2.iteye.com/upload/attachment/0090/9473/4b1f0fdb-7c5c-3b46-beac-57eb35ac1dad.png[/img]
至此问题解决。
转载请注明来源。