有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Tomcat JDBC异常池已耗尽

我总是得到同样的例外,我已经尽了最大的努力通过搜索得到解决方案,但没有任何好处

我的例外是:

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) 个答案

  1. # 1 楼答案

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

    池恢复连接的方式是,应用程序代码在处理完连接后必须调用close,从而将连接返回池。否则,据池所知,所有这些连接仍处于繁忙状态

    我对原因的第一个猜测是,您的代码甚至没有试图关闭连接。有些人(特别是那些来自PHP的人,在PHP中,自动处理这件事很常见)惊讶地发现这是他们必须自己做的事情

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

    或者,您的应用程序很忙,这些线程都在尝试完成工作。检查线程是否正在执行任何操作:添加日志以说明它们正在执行的操作,并检查应用程序和数据库之间是否存在网络流量

    有关如何终止线程,请参见Servlet “has started a thread but failed to stop it” - memory leak in Tomcat。我不认为这与失去联系的问题有直接关系,但最好知道。如果您没有做到这一点,则可以在新实例运行时在后台保持应用程序的旧实例处于活动状态