如何删除 C3P0 设置生成的 TIMED_WAITING 个线程
How to remove TIMED_WAITING threads generated by C3P0 settings
我是 c3p0 集成的新手...
我对 c3p0-0.9.5-pre5.jar
、hibernate-c3p0-3.5.6-Final.jar
、hibernate-core-3.5.6-Final.jar
和 mchange-commons-java-0.2.6.3.jar
jar 进行了这些设置,如下所示...
<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) 开发的应用程序。
我怎么才能remove/kill这些线程
不管怎样,如果您看到数以千计的线程,那么您就是在泄漏数据源。也就是说,您的应用程序正在构建 c3p0 数据源,每个数据源都有自己的线程补充,然后在没有先 close()
ing 它们的情况下丢失、取消引用或替换它们。
池化数据源应该构建一次,放置在共享可用性的某个地方,然后一遍又一遍地重复使用。如果由于某种原因异常需要重建数据源,则需要 close()
c3p0 数据源,否则它们的线程将永远存在。
可能导致此类事情的最常见错误是热重新部署的应用程序。如果在应用程序初始化时创建了数据源,则在重新部署周期的关闭挂钩中,您必须采取措施以销毁相同的数据源。
请注意,在上面的线程列表中,您显示了许多来自不同数据源的线程(因为它们在 |
之前的公共 VMID 部分之后具有不同的身份标记)。您肯定正在创建但 close()
大量数据源。
我是 c3p0 集成的新手...
我对 c3p0-0.9.5-pre5.jar
、hibernate-c3p0-3.5.6-Final.jar
、hibernate-core-3.5.6-Final.jar
和 mchange-commons-java-0.2.6.3.jar
jar 进行了这些设置,如下所示...
<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) 开发的应用程序。
我怎么才能remove/kill这些线程
不管怎样,如果您看到数以千计的线程,那么您就是在泄漏数据源。也就是说,您的应用程序正在构建 c3p0 数据源,每个数据源都有自己的线程补充,然后在没有先 close()
ing 它们的情况下丢失、取消引用或替换它们。
池化数据源应该构建一次,放置在共享可用性的某个地方,然后一遍又一遍地重复使用。如果由于某种原因异常需要重建数据源,则需要 close()
c3p0 数据源,否则它们的线程将永远存在。
可能导致此类事情的最常见错误是热重新部署的应用程序。如果在应用程序初始化时创建了数据源,则在重新部署周期的关闭挂钩中,您必须采取措施以销毁相同的数据源。
请注意,在上面的线程列表中,您显示了许多来自不同数据源的线程(因为它们在 |
之前的公共 VMID 部分之后具有不同的身份标记)。您肯定正在创建但 close()
大量数据源。