gpt4 book ai didi

java - 即使使用close关闭spring上下文,为数据库连接创建的TimerThreads仍继续运行

转载 作者:行者123 更新时间:2023-12-01 17:40:36 25 4
gpt4 key购买 nike

我使用的是Spring版本5.1.4,Apache Commons Pool2版本2.5.0(也尝试使用最新的版本2.8.0)。
一旦我的过程结束,我就会遍历所有池对象并调用GenericObjectPool.invalidateObject方法,该方法将调用
BasePooledObjectFactory.destroyObject(T t)方法。

代码如下所示:

for (int i = 0; i < numOfPooledObjects; i++)
{
GenericObjectPool.invalidateObject(GenericObjectPool.borrowObject());
}
GenericObjectPool.close();


即使在完成某些TimerThreads进程之后,它们的线程数仍与我在池中创建的对象数类似。知道这里可能有什么问题吗?

我第一次使用commons pool2库,因此可能未遵循建议的关闭/关闭池的方法。

以下是来自挂起进程的TimerThread的线程转储。

"Timer-16" #51 prio=5 os_prio=0 tid=0x00000000206c3000 nid=0xf70 in Object.wait() [0x000000002b19e000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000006d272fd10> (a java.util.TaskQueue)
at java.util.TimerThread.mainLoop(Timer.java:552)
- locked <0x00000006d272fd10> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:505)


以下是退出主要方法后在调试模式下的转储:

"Timer-14@4884" prio=5 tid=0x34 nid=NA waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.util.TimerThread.mainLoop(Timer.java:552)
at java.util.TimerThread.run(Timer.java:505)


更新:

公用池不是导致此问题的原因,这些TimerThreads是由数据库连接创建的,连接是在spring xml中配置的。

因此,尽管我在程序末尾使用context.close(),但似乎Spring上下文未正确关闭。

这是我创建上下文的方式:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");


这是关闭上下文的方法。

context.close()

最佳答案

您需要向JVM注册一个关闭钩子。选中this了解更多信息。

关于java - 即使使用close关闭spring上下文,为数据库连接创建的TimerThreads仍继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60954925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com