Tomcat JDBC异常:连接池耗尽

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数据库中的最大连接数。
我只是在想,是否在后台运行且创建线程的servlet可能是问题所在?而当任务完成时,我如何结束我的线程?
非常感谢您的帮助!
1个回答

4
从错误信息来看,似乎您的代码正在连接数据库并且没有关闭其连接。连接池恢复连接的方式是应用程序代码在完成使用连接后调用close方法,将连接返回给连接池。否则,就像连接池所知道的那样,所有这些连接都仍然很忙。我对原因的第一个猜测是您的代码甚至没有尝试关闭连接。有些人(特别是那些来自PHP的人,他们通常会自动处理此问题)会惊讶地发现这是他们必须自己做的事情。或者,某些错误条件可能会导致异常被抛出,而您的代码未正确处理该异常,并最终跳过关闭调用,当多个jdbc资源在单个finally块中关闭时,可能会发生这种情况。有关更多详细信息,请参见this answer。或者,您的应用程序只是很忙,所有这些线程都在尝试完成工作。检查线程是否正在执行任何操作:添加日志以告知它们正在做什么,并检查应用程序和数据库之间是否存在网络流量。
如何杀死线程请参见Servlet“启动了一个线程但无法停止”-Tomcat中的内存泄漏。我认为这与失去连接的问题没有直接关系,但了解这一点很重要。如果您没有正确处理,可能会在后台保留应用程序的旧实例,而新实例正在运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接