• c3p0 泄漏


    一个很重要的资料来源

    http://liu.fm/2015/07/15/c3p0/ 

    c3p0 泄漏 

    标签: c3p0hibernatekillloggingspringdao 

    2011-06-16 16:53 2660人阅读 评论(0) 收藏 举报 

    分类: 

    JAVA(120) 

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    最近的项目碰到了连接泄漏的问题。 项目用的是Spring + Hibernate + c3p0,具体表现为,系统运行一段时间后,用户打开登录页后,执行登录无响应,查看后台日志,提示Could not open Connection。将c3p0日志级别调成debug之后,发现c3p0报告连接数已经达到设置的上限。 之前检查连接泄漏时,使用的是极低效的办法,目测代码,所以问题解决起来颇费周折,效果还不好。 今天查了一下c3p0官方手册,c3p0官方提供了两个参数,能够很方便的检查没有正确返回连接池的连接。 

    debugUnreturnedConnectionStackTraces
    默认为false,如果此参数设置为true,当所有连接用完的时候,会以堆栈信息显示哪些代码使用了连接。由于跟踪连接状态会产生额外的消耗,如果程序稳定,应该将此参数恢复为默认值false

    unreturnedConnectionTimeout
    设置连接被checkout后,经过多长时间还未返还连接池,则连接缓冲池直接Kill该连接,此时,结合 debugUnretrunedConnectionStackTraces,我们可以知道是什么程序持有了连接,并且没有返回。这个方法很暴力,有可能 造成应用程序不稳定,所以,如果真的出现了连接泄漏,一时半会又找不到问题点所在,可以暂时使用这个方法让应用程序跑起来。

     

     

    首先,为了跟踪问题,debugUnreturnedConnectionStackTraces参数肯定是设置为true的。下面主要说明 unreturnedConnectionTimeout参数的设置,unreturnedConnectionTimeout参数是在连接被应用程序 checkout后指定时间内未checkin则由连接缓冲池执行kill操作,同时打印堆栈跟踪信息。在我的应用里,maxIdleTime的设置是 120秒,所以,我把unreturnedConnectionTimeout设置成150秒,如果达到最大存活时间后,连接还是不能被连接缓冲池正常关 闭,那么肯定出现了连接泄漏,此时,再过30秒后,由连接缓冲池主动执行kill

    通过以上设置后,确实收获了一些成果,通过分析日志,找到了连接泄漏问题代码。异常信息如下:

    2011-04-06 15:49:42,599 INFO : com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1395) – Logging the stack trace by which the overdue resource was checked-out.
    java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace.
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:506)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
    at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2220)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
    at com.leo.dao.XXXDAO.queryXXX(XXXDAO.java:20)
    at jsp_servlet._keyareas._country.__taskcdb_add._jspService(__taskcdb_add.java:195)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:416)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:326)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)

    通过堆栈信息,很容易就确认了问题点。这个问题点是由于DAO使用不规范导致的,XXXDAO继承了HibernateDaoSupport,在方 法中使用了getHibernateTemplate().getSessionFactory().openSession()获得session,然 后通过session.createSQLQuery(),随后却并没有执行session.close()

    关于日志大小:在目前 maxIdleTime=120,maxPoolSize=18,minPoolSize=5,idleConnectionTestPeriod=30 的情况下,日志PatternLayout %d %-5p: %l – %m%n,一天的日志记录情况大约是12M,在硬盘空间允许的情况下建议按天存储日志。 

    c3p0 连接池的日志配置 

    标签: c3p0log4jc 

    2009-01-15 12:19 5786人阅读 评论(1) 收藏 举报 

    分类: 

    Java(3) 

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    如果用c3p0的话,经常会看到控制台上报一个警告,具体内容不急得了,大意是无法初始化MLog日志,请初始化log4j
    出现此种情况是因为使用的c3p0这个连接池,并且没有正确配置其日志,只要把下面这段加到log4j.properties中即可

    #####################################################################################
    #c3p0
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=OFF,A1
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=SEVERE,A1
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=WARNING,A1
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=INFO,A2
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=CONFIG,A2
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=FINE,A2
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=FINER,A2
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=FINEST,A2
    log4j.category.com.mchange.v2.log.log4j.Log4jMLog=ALL,A2

    #c3p0 appender
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
    log4j.appender.A2=org.apache.log4j.RollingFileAppender
    log4j.appender.A2.File=${sntweb.root}/logs/c3p0.log
    log4j.appender.A2.MaxFileSize=500KB
    log4j.appender.A2.MaxBackupIndex=1
    #log4j.appender.A2.layout=org.apache.log4j.HTMLLayout
    log4j.appender.A2.layout=org.apache.log4j.SimpleLayout

    跟踪 C3p0 连接池连接泄漏之参数优化与日志分析 

    博客分类: 





      <property name="unreturnedConnectionTimeout"><value>100</value></property> 

      <property name="debugUnreturnedConnectionStackTraces"><value>true</value></property> 

    跟踪 C3p0 连接池连接泄漏 

    debugUnreturnedConnectionStackTraces、unreturnedConnectionTimeout参数的说明,此篇日志进一步介绍应用这两个参数后的一些经验。 

    首先,为了跟踪问题,debugUnreturnedConnectionStackTraces参数肯定是设置为true的。下面主要说明 unreturnedConnectionTimeout参数的设置,unreturnedConnectionTimeout参数是在连接被应用程序 checkout后指定时间内未checkin则由连接缓冲池执行kill操作,同时打印堆栈跟踪信息。在我的应用里,maxIdleTime的设置是 120秒,所以,我把unreturnedConnectionTimeout设置成150秒,如果达到最大存活时间后,连接还是不能被连接缓冲池正常关 闭,那么肯定出现了连接泄漏,此时,再过30秒后,由连接缓冲池主动执行kill。 

    通过以上设置后,确实收获了一些成果,通过分析日志,找到了连接泄漏问题代码。异常信息如下: 

        2011-04-06 15:49:42,599 INFO : com.mchange.v2.resourcepool.BasicResourcePool.removeResource(BasicResourcePool.java:1395) – Logging the stack trace by which the overdue resource was checked-out. 
        java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace. 
        at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:506) 
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 
        at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
        at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82) 
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423) 
        at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144) 
        at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139) 
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547) 
        at org.hibernate.loader.Loader.doQuery(Loader.java:673) 
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
        at org.hibernate.loader.Loader.doList(Loader.java:2220) 
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
        at org.hibernate.loader.Loader.list(Loader.java:2099) 
        at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289) 
        at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695) 
        at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142) 
        at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152) 
        at com.leo.dao.XXXDAO.queryXXX(XXXDAO.java:20) 
        at jsp_servlet._keyareas._country.__taskcdb_add._jspService(__taskcdb_add.java:195) 
        at weblogic.servlet.jsp.JspBase.service(JspBase.java:34) 
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300) 
        at weblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:416) 
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:326) 
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183) 
        at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526) 
        at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253) 

    通过堆栈信息,很容易就确认了问题点。这个问题点是由于DAO使用不规范导致的,XXXDAO继承了HibernateDaoSupport,在 方法中使用了getHibernateTemplate().getSessionFactory().openSession()获得session, 然后通过session.createSQLQuery(),随后却并没有执行session.close()。 

    关于日志大小:在目前 maxIdleTime=120,maxPoolSize=18,minPoolSize=5,idleConnectionTestPeriod=30 的情况下,日志PatternLayout %d %-5p: %l – %m%n,一天的日志记录情况大约是12M,在硬盘空间允许的情况下建议按天存储日志。 


    c3p0连接池连接泄漏检测 

    标签: c3p0数据库 

    2016-01-09 00:56 86人阅读 评论(0) 收藏 举报 

    分类: 

    Java(29) javaweb容器(1) 数据库 

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    配置文件c3p0-config.xml中加入: 
    true 

    debugUnreturnedConnectionStackTraces 默认为false,如果此参数设置为true,当所有连接用完的时候,会以堆栈信息显示哪些代码使用 
    了连接。由于跟踪连接状态会产生额外的消耗,如果程序稳定,应该将此参数恢复为默认值false。 
    unreturnedConnectionTimeout 设置连接被checkout后,经过多长时间还未返还连接池,则连接缓冲池直接Kill该连接

    设置完成后重现错误,可以观察到堆栈信息如下: 
    java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace. 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:506) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
    at com.xinge.mms.push.jdbc.C3p0ConnectionProvider.getMms2Connection(C3p0ConnectionProvider.java:47) 
    at com.xinge.mms.push.manager.DBMms2Manager.isDetail(DBMms2Manager.java:78) 
    at com.xinge.mms.push.handler.IosMessageHandler.getAlert(IosMessageHandler.java:83) 
    at com.xinge.mms.push.handler.IosMessageHandler.sendMessage(IosMessageHandler.java:70) 
    at com.xinge.mms.push.apnstask.IosMessageProcessor4Test.run(IosMessageProcessor4Test.java:59) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744)

    从中可以看到DBMms2Manager.isDetail(DBMms2Manager.java:78),查看代码发现,其中获取连接使用完后未关闭,从而造成连接泄漏

  • 相关阅读:
    java 装饰者模式与继承的区别
    Java学习笔记-多线程-创建线程的方式
    java IO流复制图片
    如何解决代码重复问题
    jdbc的基本应用
    java多线程
    java中的集合和数组
    Collections的应用
    Map集合的应用及其遍历方式
    qweb
  • 原文地址:https://www.cnblogs.com/rocky-AGE-24/p/5470875.html
Copyright © 2020-2023  润新知