如何删除C3P0设置生成的TIMED_WAITING线程

时间:2017-11-15 05:26:22

标签: java hibernate c3p0

我是c3p0集成的新手......

我在c3p0-0.9.5-pre5.jarhibernate-c3p0-3.5.6-Final.jarhibernate-core-3.5.6-Final.jarmchange-commons-java-0.2.6.3.jar jars中设置了这些设置,如下所示......

    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>

    <property name="hibernate.c3p0.min_size">1</property>
    <property name="hibernate.c3p0.max_size">5</property>
    <property name="hibernate.c3p0.timeout">40</property> 
    <property name="hibernate.c3p0.idle_test_period">30</property> 
    <!--<property name="hibernate.c3p0.max_statements">50</property>-->
    <property name="hibernate.c3p0.maxStatementsPerConnection">5</property> <!--Instead of max_statements-->
    <property name="hibernate.c3p0.validate">true</property>

    <property name="hibernate.connection.pool_size">25</property>
    <property name="hibernate.c3p0.acquire_increment">1</property>
    <property name="hibernate.c3p0.automaticTestTable">con_test</property>
    <property name="hibernate.c3p0.privilegeSpawnedThreads">true</property>
    <property name="hibernate.c3p0.contextClassLoaderSource">library</property>
    <property name="hibernate.c3p0.maxAdministrativeTaskTime">30</property>
    <property name="hibernate.c3p0.numHelperThreads">20</property>

问题是,应用程序会生成数千个的线程,并将这些线程保留为时间等待线程。

我通过循环打印了一些线程..

"<br/>" + c++ +". "+ t.getState() + " (" + t.isAlive() + ") : " + t.getName();

结果低于......

    147. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|2feccbb3]-HelperThread-#0
    148. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|8d0e89c]-HelperThread-#3
    149. WAITING (true) : Reference Handler
    150. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|8d0e89c]-HelperThread-#2
    151. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|1045f6be]-HelperThread-#8
    152. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|1045f6be]-HelperThread-#19
    153. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|3b0c81d2]-HelperThread-#17
    154. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|2feccbb3]-HelperThread-#3
    155. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|2feccbb3]-HelperThread-#1
    156. TIMED_WAITING (true) : C3P0PooledConnectionPoolManager[identityToken->1hge86f9r1gp0vs6si1few|70cef37d]-HelperThread-#19

当按应用程序从数据库检索数据时,这种情况正在逐步增加。

由Java,Struts-1,Hibernate,Oracle(BD)开发的应用程序。

如何删除/删除这些帖子

1 个答案:

答案 0 :(得分:1)

如果您看到数千个这样的线程,那么您正在泄漏DataSources。也就是说,你的应用程序正在构建c3p0 DataSources,每个都有自己的Threads补充,然后在没有close()的情况下丢失或取消引用或替换它们。

汇总的DataSource应该构建一次,放在具有共享可用性的地方,并反复重复使用。如果异常地,由于某种原因需要重建DataSource,则需要close() c3p0 DataSources或他们的线程将永远存在。

导致此类事情的最常见错误可能是热重新部署的应用程序。如果在应用程序初始化时创建了一个DataSource,则在重新部署周期的关闭钩子中,您必须获取同一DataSource被销毁的汽车。

请注意,在上面的线程列表中,您显示了来自不同DataSource的许多线程(因为它们在|之前的公共VMID部分之后具有不同的标识令牌)。你肯定在创建但不是close()大量的DataSource。