L'applicazione di database di primavera Java non chiuderà il riferimento a org.enhydra.jdbc.pool.PoolKeeper è ancora attivo, perché?
-
22-07-2019 - |
Domanda
Ciao a tutti, ho una semplice applicazione Spring che non finirà in quanto rimane ancora un riferimento a org.enhydra.jdbc.pool.PoolKeeper. Includo tutti i riferimenti che ritengo siano rivelatori di seguito sembra ok e qualcuno l'ha mai provato prima?
Ho eseguito jstack per vedere quali thread non daemon erano in esecuzione e ho trovato quanto segue.
"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)
Ora sono confuso sul perché questo accada includo parti rilevanti della mia configurazione 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>
Grazie Paul
Soluzione
Le applicazioni Web in genere configurano un contesto di applicazione Spring usando ContextLoaderListener
, che chiude il contesto dell'applicazione quando l'applicazione Web viene arrestata.
Le applicazioni Java autonome devono chiamare close
nel contesto dell'applicazione, che richiama i metodi configurati nell'attributo destroy-method
mentre distrugge i bean. In alternativa, chiama registerShutdownHook
per registrare un hook di spegnimento che chiude il contesto dell'applicazione allo spegnimento di JVM.
Altri suggerimenti
Il tuo file Spring mi sembra corretto in base all'enhydra javadoc (che è scarso nei dettagli). Ho visto un metodo stopPool ()
nell'API. Forse provalo nel tuo metodo-distruttore
?