0

大家好,我有一个简单的 Spring 应用程序,它不会结束,因为仍然有对 org.enhydra.jdbc.pool.PoolKeeper 的引用。我在下面列出了所有我认为相关的参考资料,看起来还可以吗?以前有没有人经历过这种情况?

我运行 jstack 来查看哪些非守护线程在运行,并找到以下内容。

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

现在我很困惑为什么会发生这种情况我包括我的 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>

谢谢保罗

4

2 回答 2

1

Web 应用程序通常使用 配置 Spring 应用程序上下文ContextLoaderListener,它会在 Web 应用程序停止时关闭应用程序上下文。

独立 Java 应用程序必须调用close应用程序上下文中的方法,该方法调用destroy-method属性中配置的方法,同时销毁 bean。或者,调用该registerShutdownHook方法来注册一个关闭钩子,该钩子在 JVM 关闭时关闭应用程序上下文。

于 2009-09-18T17:09:27.777 回答
0

根据 enhydra javadoc(细节很少),您的 Spring 文件对我来说是正确的。我确实stopPool()在 API 中看到了一个方法。也许在你的destroy-method?

于 2009-09-18T16:16:52.650 回答