`
henghengdh
  • 浏览: 153113 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用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连接数”页面,如下图


至此问题解决。

转载请注明来源。
  • 大小: 29.7 KB
  • 大小: 15.9 KB
  • 大小: 50.1 KB
  • 大小: 31.8 KB
  • 大小: 41.4 KB
分享到:
评论
5 楼 cheng8679724 2015-06-26  
好厉害,我没用hibernate,javamelody 里面的数据库活跃连接那个总是监控不到,不管是用spring还是jndi都不行,活动的线程也是,但是sql能出来,spring的出不来,不知道什么情况,如果可以,帮忙看看,我qq:8679724
4 楼 www88485400 2014-11-06  
blueblue24 写道
请问下我部署好以后,添加新的监控应用是添加不成功,提示:Unexpected html content type,maybe not authentified,这是什么原因?


我测试的时候也发现了这个问题,追踪半天发现时因为在添加监控的时候,被监控端权限被拦截导致返回登陆页面导致得不到想要的数据导致的,不知道你的是不是这个问题,可以参考一下。
3 楼 blueblue24 2014-10-09  
请问下我部署好以后,添加新的监控应用是添加不成功,提示:Unexpected html content type,maybe not authentified,这是什么原因?
2 楼 henghengdh 2014-09-05  
leixl 写道
请问下,图标上面显示中文跟横坐标的时间是在哪里配置之后才显示的呢?

有啥办法获取到这个的监控数据?


默认就显示的,你的不显示吗?
监控数据在tomcat下的temp文件夹里,有没有数据接口我还不知道
1 楼 leixl 2014-09-01  
请问下,图标上面显示中文跟横坐标的时间是在哪里配置之后才显示的呢?

有啥办法获取到这个的监控数据?

相关推荐

    JAVA+ACCESS连接池(精典)

    JAVA+ACCESS连接池JAVA+ACCESS连接池JAVA+ACCESS连接池JAVA+ACCESS连接池JAVA+ACCESS连接池JAVA+ACCESS连接池JAVA+ACCESS连接池

    JAVA 使用数据库连接池连接Oracle数据库全代码

    JAVA 使用数据库连接池连接Oracle数据库,全代码,附加详细说明

    使用Java编写的RabbitMQ连接池方法

    RabbitMQ客户连接池的Java实现。我们刚开始也是采用这种方式来实现的,但做压力测试时,发现这种每次新建Connection和新建Channel是非常耗时的,在大并发下,一般都要8毫秒左右,慢的话,好多都是几十毫秒。因此我们...

    C3P0数据库连接池

    C3P0数据库连接池和jar包,因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连接都需要140毫秒左右的时间,所以耗费时间比较多。若使用C3P0连接池来池化...

    Java中数据库连接池原理机制的详细讲解

    本文讨论的连接池包括一个连接池类(DBConnectionPool)和...还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时、通讯问题,并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。

    Java jdbc数据库连接池总结

    在Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁

    java ftp连接池

    在网上找了好久没有现成的ftp连接池jar包,自己花了一些时间实现了一个简单的连接池,用了一段时间稳定性还可以。

    java数据库连接池

    为解决上述问题,可以采用数据库连接池技术。 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接, 当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后...

    EsClientPoolFactory.java(es连接池工厂类)

    使用过Elasticsearch RestFul API的都知道,在Java端使用是ES服务需要创建Java Client,...所以为了解决上述问题并提高client利用率,用池化技术复用client,第一次用去创建client,后面使用就直接去池子里面拿就可以

    java apache 数据库连接池 天涯浪子

    java apache 数据库 连接池 里边附加使用方法

    java socket连接池 实现

    NULL 博文链接:https://516100981.iteye.com/blog/2314314

    模拟的Java连接池

    模拟的Java连接池 模拟的Java连接池 模拟的Java连接池 模拟的Java连接池

    Java各数据库连接池配置介绍

    详细介绍常用Java各数据库连接池配置,包括C3P0,DBCP,Proxool等。

    mongodb Java连接池

    mongodb Java连接池配置 用于避免Java连接mongodb数据库数过高引起的一系列问题

    java实现连接池

    java 实现连接池 . 希望高手指点迷津.

    java连接池文件,连接池

    java连接池文件 java连接池文件 java连接池文件

    java连接池的配置

    java连接池的配置 里面有C3P0连接池在tomcat中的详细配置 Java反射机制总结,tomcat下配置数据库连接池DBCP、C3P0、Proxool 总结spring下配置dbcp,c3p0,proxool数据源链接池

    Java 连接池源码

    个人实现Java连接池源码 Java 连接池源码 仅供参考

    ElasticSearchPoolUtil.java(es连接池工具类)

    使用过Elasticsearch RestFul API的都知道,在Java端使用是ES服务需要创建Java Client,...所以为了解决上述问题并提高client利用率,用池化技术复用client,第一次用去创建client,后面使用就直接去池子里面拿就可以

    连接池案例 连接池案例

    连接池案例

Global site tag (gtag.js) - Google Analytics