`

利用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 jdbc数据库连接池总结

    数据库连接池(connection pool)的工作原理是为了解决资源的频繁分配、释放所造成的问题。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时...

    java socket连接池 实现

    总的来说,Java Socket连接池是解决高并发网络环境下性能问题的有效手段。通过合理的设计和管理,不仅可以减少系统资源的浪费,还能提升应用的整体响应速度和稳定性。在选择和使用Socket连接池时,应根据项目需求和...

    java ftp连接池

    Java FTP连接池是一种用于管理FTP(文件传输协议)连接的资源池,它的主要目标是提高应用程序的性能和效率。在传统的FTP操作中,每次需要连接到FTP服务器时都会创建一个新的连接,这会消耗大量时间和系统资源。而...

    Mongodb连接池for java

    描述中提到的“解决连接池不够的问题,多连接的问题”,意味着在实际项目开发中,可能会遇到因为数据库连接数量不足或者频繁创建和关闭连接导致的性能瓶颈。通过使用连接池,开发者可以在应用启动时预先分配一定数量...

    java实现连接池

    理解并正确使用Java连接池是任何涉及数据库操作的Java应用的基础,它对于优化系统性能、提高资源利用率和保证服务稳定性都有着重要作用。选择合适的连接池库并进行适当的配置,可以进一步提升系统的响应速度和并发...

    java socket连接池

    为了解决这个问题,引入了Socket连接池的概念。 连接池的工作机制如下: 1. 初始化:在服务器启动时,预先创建一定数量的Socket连接,放入池中。 2. 借用与归还:当客户端请求到来时,服务器从连接池中取出一个已...

    JAVA+ACCESS连接池(精典)

    在Java编程中,数据库...通过以上知识,你可以理解如何在Java应用程序中利用连接池与ACCESS数据库交互,提高系统的性能和可伸缩性。在实际项目中,根据具体需求选择合适的数据库和连接池实现,以达到最佳的性能效果。

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

    ### JAVA 使用数据库连接池连接Oracle数据库全代码解析 #### 一、概述 本文将详细介绍如何在Java项目中使用Apache DBCP(Database Connection Pool)来连接Oracle数据库,并提供完整的示例代码。通过这种方式,我们...

    java手写数据库连接池

    主要包括初始化连接池、获取连接、释放连接、监控连接池状态等功能。使用线程安全的数据结构(如`ConcurrentHashMap`)来存储和管理连接,确保在多线程环境下能正确地并发操作。 3. **数据库连接对象...

    Java 连接池源码

    然而,了解连接池的内部工作原理对于优化数据库操作和解决相关问题至关重要。 个人实现Java连接池源码可以让你深入理解这一过程。首先,我们需要定义一个连接池类,这个类通常包含以下组件: 1. **连接池初始化**...

    Java 连接池实现

    Java连接池(Connection Pool)就是一种有效的解决方案,它提高了数据库访问效率,减少了系统资源消耗。本篇我们将深入探讨Java连接池的实现及其重要性。 首先,我们要理解什么是数据库连接池。数据库连接池在初始...

    java连接池proxool

    Java连接池,特别是Proxool,是数据库管理中一个至关重要的概念,它提高了数据库操作的效率和性能。连接池在Java应用程序中起着桥梁的作用,它管理数据库连接,避免了频繁创建和销毁连接的开销。Proxool是Apache软件...

    java实现jdbc连接池+相关jar包

    Java JDBC 连接池是Java应用程序管理数据库连接的一种高效方式,它可以提高应用性能并优化资源使用。连接池在初始化时创建一定数量的数据库连接,并在应用程序需要时提供这些连接,用完后则回收到池中,而不是每次...

    java_jdbc数据库连接池总结

    解决多数据库服务器和多用户问题可以设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中包含了不同的数据库连接信息。 Java JDBC 数据库连接池的优点包括: 1. 提高...

    基于Java的数据库连接池组件

    总之,基于Java的数据库连接池组件为数据库访问提供了高效率的解决办法,是当今企业级Java应用开发中不可或缺的一部分。通过合理使用连接池,不仅能够提高数据库的访问效率,还能减少因频繁的数据库连接创建和销毁所...

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

    - **并发问题**: 在多线程环境下,为了保证连接池的安全性和高效性,需要解决并发访问连接池的问题。Java语言本身提供了`synchronized`关键字来确保线程安全。例如,在连接池类的方法上使用`synchronized`关键字可以...

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

    在Java Web开发中,数据库连接池是不可或缺的一部分,尤其是在高并发环境下。 天涯浪子可能是在指一个开发者或教程作者,他分享了关于如何在Java项目中使用Apache数据库连接池的具体方法和实践经验。以下是对这个...

Global site tag (gtag.js) - Google Analytics