Приложение базы данных Java Spring не прекратит ссылаться на org.enhydra.jdbc.pool.PoolKeeper все еще активен, почему? - PullRequest
0 голосов
/ 18 сентября 2009

Привет всем. У меня есть простое приложение Spring, которое не завершится, так как осталась ссылка на org.enhydra.jdbc.pool.PoolKeeper. Я включаю все ссылки, которые, по моему мнению, изумительны ниже, выглядит ли это нормально, и кто-нибудь испытывал это раньше?

Я запустил jstack, чтобы посмотреть, какие потоки не работают, и обнаружил следующее.

"Thread-1" prio=10 tid=0x00007f89b03d8000 nid=0x755 in Object.wait() [0x00007f89bc243000]    java.lang.Thread.State: TIMED_WAITING (on object monitor)  at java.lang.Object.wait(Native Method)
    - waiting on <0x00007f89ec57de00> (a org.enhydra.jdbc.pool.PoolKeeper)  at org.enhydra.jdbc.pool.PoolKeeper.run(PoolKeeper.java:55)
    - locked <0x00007f89ec57de00> (a org.enhydra.jdbc.pool.PoolKeeper)  at java.lang.Thread.run(Thread.java:619)

Теперь я не понимаю, почему это происходит, я включил соответствующие части моей конфигурации JPA

<bean id="innerDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource"
    destroy-method="shutdown">
    <property name="transactionManager" ref="jotm" />
    <property name="driverName" value="${jdbc.driverClassName}"/>
    <property name="url" value ="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="dataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
    destroy-method="shutdown">
    <property name="dataSource" ref="innerDataSource"/>
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="maxSize" value="100" />
    <!-- test your jdbc connection before using it -->
    <property name="checkLevelObject" value="${jdbc.checkLevelObject}"/>
    <property name="jdbcTestStmt" value="${jdbc.jdbcTestStmt}"/>
</bean>

Спасибо Пол

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Веб-приложения обычно настраивают контекст приложения Spring, используя ContextLoaderListener, который закрывает контекст приложения при остановке веб-приложения.

Автономные Java-приложения должны вызывать метод close в контексте приложения, который вызывает методы, настроенные в атрибуте destroy-method, при уничтожении bean-компонентов. В качестве альтернативы вызовите метод registerShutdownHook, чтобы зарегистрировать обработчик завершения работы, который закрывает контекст приложения при завершении работы JVM.

0 голосов
/ 18 сентября 2009

Ваш файл Spring выглядит корректно для меня на основе Enhydra Javadoc (который немногочислен в деталях). Я видел stopPool() метод в API. Возможно, попробуйте это в вашем destroy-method?

...