Cannot get a connection, pool exhausted

tomcat 连接池泄露的问题:Cannot get a connection, pool exhausted
1 问题描述
Web程序在tomcat刚开始运行时速度很快,但过一段时间后发现速度变得很慢。
检查日志输出,发现异常如下:

org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:
java.util.NoSuchElementException: Timeout waiting for idle object


2 问题解决

tomcat 的数据源定义提供了三个参数:
a. 如果设为true则tomcat自动检查恢复重新利用,没有正常关闭的Connection.(默认是false)

<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>

b. 设定连接在多少秒内被认为是放弃的连接,即可进行恢复利用。
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>

c. 输出回收的日志,可以详细打印出异常从而发现是在那里发生了泄漏
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>



附 spring配置 BasicDataSource的相关参数解释
1 初始化连接 
   initialSize=10 

2  最大空闲连接
   maxIdle=20

3 最小空闲连接
   minIdle=5 

4 最大连接数量
maxActive=50 

5 是否在自动回收超时连接的时候打印连接的超时错误
logAbandoned=true

6 是否自动回收超时连接
removeAbandoned=true 

7 超时时间(以秒数为单位) 
removeAbandonedTimeout=180 

8 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
    maxWait=1000

maxActive、maxIdle 建议设置 maxActive="300" maxIdle="50"

maxActive 设置在300-1000之间

maxIdle   设置在 20-100 之间

还有就是在程序的 finally 里面要关闭 Connection

例如: DbHelper.closedAll(rs, ps, conn);

 

maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连 
接将被标记为不可用,然后被释放。设为0表示无限制。 
MaxActive,连接池的最大数据库连接数。设为0表示无限制。 
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示 
无限制。 

*maxActive:最大连接数据库连接数,设 0 为没有限制 
*maxIdle:最大等待连接中的数量,设 0 为没有限制 
*maxWait:最大等待毫秒数, 单位为 ms, 超过时间会出错误信息 

一般把maxActive设置成可能的并发量就行了 

maxActive、maxIdle和maxWait参数: 


maxActive是最大激活连接数,这里取值为20,表示同时最多有20个数据库连  
 接。maxIdle是最大的空闲连接数,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的 

连接,而不被清除,随时处于待命状态。MaxWait是最大等待秒钟数,这里取值-1,表示无限等待,直到 

超时为止

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用 Hibernate 和 Atomikos 的连接池配置,如果仍然遇到 "Connection pool exhausted" 的错误,有几个可能的原因和解决方法: 1. 配置错误:请确保您正确地配置了连接池的最大大小(maxPoolSize)。您可以检查 Hibernate 和 Atomikos 的配置文件,确保将其设置为适当的值。例如,如果您希望最大连接数为 10,可以将 maxPoolSize 设置为 10。 2. 连接泄漏:连接泄漏是指在使用完连接后未正确关闭或释放连接,导致连接无法再次使用。请确保您在使用完连接后始终正确地关闭连接。可以使用 try-with-resources 或手动调用 close() 方法来确保连接被正确关闭。 3. 连接占用时间过长:如果某些操作需要较长时间才能完成,可能会导致连接被占用并且无法释放给其他请求。请检查您的代码逻辑,确保在不需要连接时及时释放它们。 4. 连接池配置不足:除了 maxPoolSize 外,还有其他一些连接池配置参数可能需要调整,例如 minPoolSize(最小连接数)、maxIdleTime(最大空闲时间)等。根据您的具体需求,可能需要调整这些参数以适应并发请求。 5. 资源限制:检查系统资源限制,例如数据库服务器的最大连接数和线程数,确保它们与连接池配置相匹配。如果数据库服务器的最大连接数小于连接池的最大连接数,可能会导致连接池耗尽。 请根据您的具体情况逐一排查以上可能的问题,并进行相应的调整和优化。希望能帮到您!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值