gpt4 book ai didi

java - Tomcat JDBC 异常池耗尽

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:02 26 4
gpt4 key购买 nike

我总是遇到同样的异常,我已尽最大努力通过搜索来获得解决方案,但没有任何好处。

我的异常(exception)是:

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 是否可能是问题所在?以及如何在任务完成后终止我的线程?

感谢您的帮助!!

最佳答案

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

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

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

或者,某些错误情况可能会导致在您的代码未正确处理异常的情况下抛出异常,并最终跳过对关闭的调用,当多个 jdbc 资源在一个 finally 中关闭时可能会发生这种情况堵塞。有关详细信息,请参阅 this answer .

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

有关如何终止线程的信息,请参阅 Servlet “has started a thread but failed to stop it” - memory leak in Tomcat .我不认为这与连接断开问题直接相关,但很高兴知道。如果您没有做到这一点,则可以在新实例运行时让应用程序的旧实例在后台保持 Activity 状态。

关于java - Tomcat JDBC 异常池耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13412824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com