L'applicazione di database di primavera Java non chiuderà il riferimento a org.enhydra.jdbc.pool.PoolKeeper è ancora attivo, perché?

StackOverflow https://stackoverflow.com/questions/1445503

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

È stato utile?

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 ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top