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

标签 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. 如果情况并非如此,那么我如何知道哪些功能正在占用线程?

最佳答案

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/

相关文章:

mysql - 在hadoop上使用sqoop import命令时出现错误

java - 等待空闲对象 Apache 连接池超时

java - 线程池连接 vs 单例设计模式获取单个数据库连接

java错误未报告异常java.lang.Exception;必须被捕获或宣布被扔出

java - 仅使用依赖项重新测试重新编译的测试?

java - 步骤定义中的 Cucumber jvm varargs 支持

MySQL 错误 1045 (28000) : Access denied for user 'bill' @'localhost' (using password: YES)

MySQL:数据库查询不正确或结构错误?

java - 调整 JFrame 大小后组件重新定位,并通过拖动鼠标手动调整右上角大小

java - 使用 C3P0 的 JDBC 连接池