为地址为null和端口8080的连接器创建的最大线程数(200)

时间:2014-09-30 15:01:46

标签: java mysql connection-pooling apache-commons-pool

我大约每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)

所以我的问题是:

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

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

1 个答案:

答案 0 :(得分:0)

  

我大约每7-8天就会发现这个错误。

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

  

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

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

  

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

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