You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache BasicDataSource的setMaxTotal作用及连接池超限行为探究

Apache BasicDataSource连接池配置疑问

我在AWS上部署了MySQL数据库,执行show variables like 'max_connections'后得知其最大连接数为60。于是我使用Apache的javax.sql.DataSource实现(即BasicDataSource)作为连接池,将活跃连接的最大值设为60:

...
connectionPool = new BasicDataSource();
connectionPool.setUrl("...");
connectionPool.setMaxTotal(60);
...

但代码仍偶尔抛出TooManyConnectionsDatabaseException异常。这让我疑惑:setMaxTotal对连接池的实际作用是什么?

假设数据库服务器仅支持100个活跃连接,而我从连接池请求500个连接,会发生什么?

  • 客户端连接池是否会创建包含400个请求的内部队列,让这400个线程休眠?
  • 还是会无视连接数限制,向MySQL发送500个请求?(若如此,该限制意义何在?)
  • 或是直接为剩余400个连接抛出异常?

设置连接池的最大活跃连接数到底有什么作用?当代码请求的连接数超过设定最大值时,连接池会如何表现?


正确答案验证

基于@mark-rotteveel的提示,我打印connectionPool.getMaxWaitMillis()后发现最大等待时间为-1ms,这表示使用-1让连接池无限等待。于是我修改连接初始化代码:

connectionPool.setMaxTotal(1); // 同一时间仅允许1个活跃连接
connectionPool.setMaxWaitMillis(1); // 仅等待1ms获取空闲连接

代码立刻抛出:

java.sql.SQLException: Cannot get a connection, pool error Timeout waiting for idle object

这与预期一致,逻辑通顺!

内容的提问来源于stack exchange,提问作者corgrath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:12:05