0

我大约每 7-8 天在 prod 上收到此错误。所以为了调试这个问题,我下载了线程转储文件。该文件具有以下线程状态 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)

所以我的问题是:

  1. 这个异常是因为mysql连接池吗?如果是,我应该怎么做才能解决它?我的 MAX-Active 值为 50,MinIdle 值为 1。

  2. 如果不是这种情况,那么我怎么知道哪些功能正在持有线程?

4

1 回答 1

0

我大约每 7-8 天在 prod 上收到此错误。

很可能您没有确定性地清理所有资源(即当您完成它们时),因此可以将连接返回到池中。GC 会定期清理连接,但有时这还不够。简而言之,确保你总是在回收你的连接(除非它们已经死了)

这个异常是因为mysql连接池吗?

这不是一个例外,它是您要求转储的堆栈跟踪。事实上,没有办法在线程转储中看到异常(除非您碰巧看到它创建异常)

如果不是这种情况,那么我怎么知道哪些功能正在持有线程?

这些线程处于这种状态是因为它们没有任何事情可做。很可能是因为另一个应该做某事的线程花费了太长时间。我建议您查看代码中正在运行或等待的线程,看看是什么阻塞了您的应用程序。

于 2014-09-30T15:19:19.497 回答