我大约每7-8天就会发现这个错误。所以为了调试这个问题,我下载了线程转储文件。此文件具有以下线程状态100次:
"http-8080-198" daemon prio=10 tid=0x08a62c00 nid=0x3a78 in Object.wait() [0x66467000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x87097728> (a org.apache.commons.pool.impl.GenericObjectPool$Latch)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
- locked <0x87097728> (a org.apache.commons.pool.impl.GenericObjectPool$Latch)
所以我的问题是:
这是因为mysql连接池的异常吗?如果是,我该怎么做才能解决它?我的MAX-Active值为50,MinIdle值为1.
如果不是这种情况,那么我怎么知道哪些功能正在保留线程?
答案 0 :(得分:0)
我大约每7-8天就会发现这个错误。
很可能您没有确定性地清理所有资源(即,当您完成它们时),因此可以将连接返回到池中。 GC会定期清理连接,但有时候这还不够。简而言之,确保你总是回收你的联系(除非他们死了)
这是因为mysql连接池的异常吗?
这不是一个例外,它是您要求转储的堆栈跟踪。事实上,没有办法在线程转储中看到异常(除非在非常罕见的情况下您碰巧看到它创建了异常)
如果不是这种情况,那么我怎么知道哪些功能正在保存线程?
这些线程处于这种状态,因为它们没有任何关系。很可能是因为另一个应该做某事的线程花了太长时间。我建议您查看代码中正在运行或等待的线程,以查看阻止您的应用程序的内容。