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

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

运行一段时间后发现,调度程序的连接池一直在不停增长,大概8个小时能增加600-800个连接,等到连接数量达到连接上设置的上限后,程序就开始一直等待不工作了。

刚开始以为是连接池配置问题,调了好几个方案,问题没有解决,就怀疑到了是代码里事务的问题,这下就不好办了,因为项目中混合使用了hibernate和jdbcTemplate,而且方法也不少,具体定位很麻烦(本人巨懒)。

刚好前几天在新项目中用了JavaMelody监控性能,那就还试试用这个工具来找原因吧.

JavaMelody的安装方法另一个文章了已经写了, http://henghengdh.iteye.com/blog/1967755,但是想要监控到jdbc连接,还要单独配置下连接池。

因为调度程序同时使用了hibernate和jdbcTemplate,那么另一篇文章里的单纯hibernate配置就不管用了,需要配置jndi的方式。
第一步,在tomcat的server.xml中,在GlobalNamingResources标签中添加jndi数据源。
<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" />
	

第二步,将配置的数据源放入tomcat的context.xml中,以供tomcat全局调用。在context节点中,添加
<ResourceLink name="jdbc/dataSourceOld" global="jdbc/dataSourceOld" type="javax.sql.DataSource"/>
	

第三步,在项目的spring配置文件中,引入jndi数据源。
在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>

最后,将c3p0和sql2005的jar包放入tomcat的lib文件夹里(用其他连接池和数据库的放对应的jar包),然后按照http://henghengdh.iteye.com/blog/1967755的JavaMelody安装方法把JavaMelody加入项目中。

到这里,项目和JavaMelody已经配置好了,启动项目,在JavaMelody监控台里添加项目地址就能看到项目的运行状态了。


如上图被使用的jdbc连接数,最高达到了311,因为调度程序基本不会有并发的情况,所以我给调度程序设置的连接上线是50个,这肯定就是有连接没有释放了,然后往下看系统信息这里


点击红圈圈住的地方,出现下图


这里就是所有正在使用的连接了,鼠标放到时间出,可以看到详细信息,如下图


红圈处定位到了具体的类和方法,剩下的问题就好说了,改方法就是了。

最后的方法问题。。。。不想说了。。。n+1次的倒在了opensession()和getCurrentSession()前面。。。

修改完方法后重启项目,再进入“被打开的JDBC连接数”页面,如下图


至此问题解决。

转载请注明来源。

猜你喜欢

转载自henghengdh.iteye.com/blog/1972134
今日推荐