4

我总是遇到同样的例外,我已经尽我所能通过搜索来获得解决方案,但没有任何好处。

我的例外是:

SEVERE: Exception : org.apache.tomcat.jdbc.pool.PoolExhaustedException: [pool-2-thread-1] Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:100; busy:100; idle:0; lastwait:30000].
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:672)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:187)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
    at com.xxxxx.dbmanager.utils.DBManager.getConnection(DBManager.java:81)
    at com.xxxxx.dbmanager.utils.SQLManager.<init>(SQLManager.java:36)
    at ...
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

我试图增加 mysql DB 中的最大连接数。

我只是想知道在后台运行并创建线程的 servlet 是否可能是问题所在?任务完成后如何杀死我的线程?

感谢您的帮助!

4

1 回答 1

4

从错误消息看来,您的代码正在连接到数据库并且从未关闭其连接。

池恢复连接的方式是应用程序代码必须在连接完成后调用 close,这会将连接返回到池中。否则,据池所知,所有这些连接仍然很忙。

我对原因的第一个猜测是您的代码甚至没有尝试关闭连接。有些人(尤其是那些来自 PHP 的人,通常会自动处理这些问题)惊讶地发现这是他们必须自己做的事情。

或者,某些错误条件可能会导致在您的代码未正确处理异常的情况下引发异常,并最终跳过关闭调用,当多个 jdbc 资源在单个 finally 块中关闭时,可能会发生这种情况。有关更多详细信息,请参阅此答案

或者,您的应用程序只是很忙,而这些线程都在努力完成工作。检查线程是否在做任何事情:添加日志以告知它们在做什么,并检查您的应用程序和数据库之间是否存在网络流量。

有关如何杀死线程,请参阅Servlet “已启动线程但未能停止它” - Tomcat 中的内存泄漏。我认为这与失去连接的问题没有直接关系,但很高兴知道。如果您没有正确执行此操作,则可以在新实例运行时使应用程序的旧实例在后台保持活动状态。

于 2018-05-06T18:10:21.607 回答