首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除由TIMED_WAITING设置生成的C3P0线程

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

Stack Overflow用户
提问于 2017-11-15 05:26:21
回答 1查看 942关注 0票数 0

我在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的设置如下.

代码语言:javascript
复制
    <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>

问题是,应用程序生成数千个线程,并在等待线程时保留这些线程。

我用循环打印了其中的一些线程。

代码语言:javascript
复制
"<br/>" + c++ +". "+ t.getState() + " (" + t.isAlive() + ") : " + t.getName();

结果低于..。

代码语言:javascript
复制
    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)开发.

如何删除/杀死这些线程

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 09:49:24

不管怎样,如果你看到上千条这样的线程,你就是在泄露DataSources。也就是说,您的应用程序正在构造c3p0 DataSources,每个DataSources都有自己的线程补充,然后它将丢失、取消引用或替换它们,而不首先对它们进行close()

池化DataSource应该构建一次,放置在具有共享可用性的地方,并一次又一次地重用。如果不寻常的是,由于某种原因需要重建DataSource,您需要close() c3p0 DataSources,否则它们的线程就会永远存在。

可能导致这类问题的最常见错误是热重新部署的应用程序。如果在应用程序初始化时创建了一个DataSource,那么在重新部署周期中的关闭钩子中,您必须使用相同的DataSource被销毁的car。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47299984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档