大约每 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。
如果情况并非如此,那么我如何知道哪些功能正在占用线程?
最佳答案
I am getting this error on prod in approximately every 7-8 days.
很可能您没有确定性地清理所有资源(即当您完成它们时),因此连接可以返回到池中。 GC 会定期清理连接,但有时这还不够。简而言之,确保您始终回收您的连接(除非它们已失效)
Is this exception because of mysql connection pool?
这不是一个异常(exception),它是您要求转储的堆栈跟踪。事实上,没有办法在线程转储中看到异常(除非在极少数情况下您碰巧看到它创建了异常)
If this is not the case then how can I know which functionality are holding threads?
这些线程处于这种状态是因为它们没有任何事情可做。最有可能的是因为另一个应该做某事的线程花费了太长时间。我建议您查看代码中正在运行或正在等待的线程,以了解可能阻止您的应用程序的线程。
关于java - 为地址为 null 且端口为 8080 的连接器创建的最大线程数 (200),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124059/