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é?
-
22-07-2019 - |
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
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
?