L'application de base de données Java Spring ne quittera pas la référence à org.enhydra.jdbc.piscine.PoolKeeper est toujours actif pourquoi?


Bonjour à tous j'ai une simple application Spring qui ne se terminera pas car il reste encore une référence à org.enhydra.jdbc.piscine.PoolKeeper. J'inclus toutes les références que je sens sont révélatrices ci-dessous est-ce que cela semble ok et quelqu'un a-t-il déjà vécu cela?

J'ai couru jstack pour voir quels threads non daemon étaient en cours d'exécution et j'ai trouvé ce qui suit.

"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)

Maintenant, je ne sais pas pourquoi cela se produit, j'inclus des parties pertinentes de mon JPA configuration

<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>

Merci Paul

Author: Paul Whelan, 2009-09-18

2 answers

Les applications Web configurent généralement un contexte d'application Spring en utilisant ContextLoaderListener, qui ferme le contexte de l'application lorsque l'application Web est arrêtée.

Les applications Java autonomes doivent appeler le close méthode sur le contexte de l'application, qui appelle les méthodes configurées dans l'attribut destroy-method tout en détruisant les beans. Sinon, appelez le registerShutdownHook méthode pour enregistrer un hook d'arrêt qui ferme le contexte de l'application sur la JVM arrêt.

 1
Author: Chin Huang, 2009-09-18 19:06:50

Votre fichier Spring me semble correct sur la base du javadoc enhydra (qui est clairsemé sur les détails). J'ai vu une méthode stopPool() dans l'API. Peut-être essayer cela dans votre destroy-method?

 0
Author: SingleShot, 2009-09-18 16:16:52