La aplicación de base de datos Java Spring no dejará de hacer referencia a org.enhydra.jdbc.pool.PoolKeeper todavía está activo ¿por qué?

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

Pregunta

Hola a todos, tengo una aplicación Spring simple que no terminará ya que todavía queda una referencia a org.enhydra.jdbc.pool.PoolKeeper. Incluyo todas las referencias que siento son reveladoras a continuación. ¿Se ve bien y alguien ha experimentado esto antes?

Ejecuté jstack para ver qué hilos no daemon se ejecutaban y encontré lo siguiente.

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

Ahora estoy confundido acerca de por qué sucede esto, incluyo partes relevantes de mi configuración 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>

Gracias Paul

¿Fue útil?

Solución

Las aplicaciones web normalmente configuran un contexto de aplicación Spring utilizando ContextLoaderListener , que cierra el contexto de la aplicación cuando se detiene la aplicación web.

Las aplicaciones Java independientes deben llamar a close en el contexto de la aplicación, que invoca los métodos configurados en el atributo destroy-method mientras destruye los beans. Alternativamente, llame al registerShutdownHook para registrar un enlace de cierre que cierra el contexto de la aplicación en el cierre de JVM.

Otros consejos

Su archivo Spring me parece correcto según el enhydra javadoc (que es escaso en detalles). Vi un método stopPool () en la API. ¿Quizás intente eso en su método-destrucción ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top