Как удалить темы TIMED_WAITING, созданные настройками C3P0
Я очень новичок в интеграции 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
банки, как показано ниже...
<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 ответ
Так или иначе, если вы видите тысячи таких потоков, вы пропускаете источники данных. То есть ваше приложение создает источники данных c3p0, каждый из которых имеет свой собственный набор потоков, затем теряет или разыменовывает их или заменяет без предварительного close()
их
Объединенный источник данных должен быть создан один раз, размещен где-то с общей доступностью и многократно использоваться снова и снова. Если, по какой-то причине, по каким-либо причинам требуется реконструкция источника данных, вам необходимо close()
Источники данных c3p0 или их потоки будут жить вечно.
Пожалуй, самая распространенная ошибка, которая приводит к такого рода вещам, - это приложения, которые можно горячо перераспределить. Если при инициализации приложения создается DataSource, в хуке выключения в цикле повторного развертывания вы должны взять машину, которая уничтожает тот же DataSource.
Обратите внимание, что в приведенном выше списке потоков вы видите много потоков из разных источников данных (так как они имеют разные маркеры идентификации после общей части VMID перед |
). Вы определенно создаете, но не close()
много источников данных.