利用JavaMelody解决连接池不释放的问题

公司新项目上线,需要从老数据库中定时同步部分数据到新数据库中,写了一个调度程序来做。

运行一段时间后发现,调度程序的连接池一直在不停增长,大概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]
<Resource name="jdbc/dataSourceOld"
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节点中,添加
<ResourceLink name="jdbc/dataSourceOld" global="jdbc/dataSourceOld" type="javax.sql.DataSource"/>

[b]第三步,在项目的spring配置文件中,引入jndi数据源。[/b]
在applicationContext.xml中添加
<bean id="oldDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/dataSourceOld</value>
</property>
</bean>
<!-- Hibernate配置 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="oldDataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>

</props>
</property>
<property name="packagesToScan" value="com.jxet.domain.entity.sms" />
</bean>

[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]

至此问题解决。

转载请注明来源。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值