org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object异常原因

在使用Tomcat JNDI配置数据库连接时,若未使用连接池组件,可能会遇到""org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object""的异常。该问题源于连接池资源耗尽,大量并发请求导致连接未及时释放。当异常发生后,服务会持续报错并需要重启Tomcat来恢复,严重影响服务稳定性。" 126113583,12584283,MySQL模糊查询优化策略,"['后端', '数据库', 'SQL']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用tomcat的JNDI配置数据库连接时,如果没有使用想proxool,池c3p0这样的连接池组件时,tomcat将默认使用tomcat容器内建的DHCP连接池组建。

我的jndi配置如下

    <Resource
      name="jdbc/NEWDB"
      type="javax.sql.DataSource"
      username="APDEV"
      password="123456"
      driverClassName="net.sourceforge.jtds.jdbcx.JtdsDataSource"
      maxIdle="2"
      maxWait="5000"
      url="jdbc:jtds:sqlserver://172.18.127.129:1433/NEWDB"
      maxActive="4"
   />

为了在开发阶段尽可能的暴露是否存在连接未完全释放的问题,将maxActive和maxIdle参数都设置的比较小。

有一种情况就是,如果某个页面存在大量的数据库查询操作(例如:此页面加载时将要建立4个connection),那么当我在此页面频繁的刷新页面时,将会抛出异常

 org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

经过调查发现,抛出此异常的原因为连接池泄漏,也就是再也无法从连接池中获取有效的数据库连接。

频繁的刷新页面导致上一次获取的connection还没有得到有效释放,下一次的connection请求已经到达,如是刷新多次后导致池资源耗尽,即所谓的连接池泄漏。

   而且,在此种情况下,最糟糕的是异常发生后导致整个服务向连接池发起connection请求都将一直抛出如上异常,无法恢复到正常状态。服务宕机,必须重启tomcat才能恢复,这真是个可怕的事情。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值