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
相关产品推荐
相关产品推荐

