在AWS上有一个MySQL数据库,我发现在执行show variables like 'max_connections'操作时,它允许的最大连接数是60:

enter image description here

所以当使用Apache's javax.sql.DataSource implementation as my connection pool时,我可以将最大值active connections设置为60.

...

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

但是,我的代码中有时仍然会出现TooManyConnectionsDatabaseException个异常.

这让我想知道:这实际上对连接池实现有什么作用?

假设一台服务器只能处理100个活动连接,而我从一个连接池创建了500个连接,那么会发生什么?

  • 客户端上的连接池是否创建了400个内部队列并暂停/Hibernate 400个连接线程?

  • 或者,它会try 向MySQL数据库发送500个请求,而不考虑设置最大连接数吗?(如果是,限制的意义是什么)

  • 或者它是否会为其他400个连接抛出编码异常?

设置连接池的最大活动连接数到底有什么作用?连接池在代码中的行为如何想要创建比您设置的最大值更多的连接?


UPDATE AFTER RIGHT ANSWER

这是基于@mark-Rotteveel的回答.

通过打印connectionPool.getMaxWaitMillis(),我看到最大等待时间是-1毫秒,这意味着Use -1 to make the pool wait indefinitely.毫秒.

因此,我try 将连接初始化代码更改为:

connectionPool.setMaxTotal(1); // Only have 1 active connection at the same time
connectionPool.setMaxWaitMillis(1); // Only wait 1ms for a free connection

我的代码立刻就得到了

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

这是意料之中的,也是有意义的!

推荐答案

setMaxTotal设置连接池的特定实例可以创建的最大连接数.如果您将其设置为60,并且您的服务器也有最多60个,则它可能会工作,或者如果还有其他创建连接的东西(例如,监控工具、应用程序的其他实例等),则它可能会失败.

setMaxTotal只涉及连接池的特定实例,它不跟踪或监视服务器允许的连接数量:您有责任适当地配置它(或MySQL服务器),以避免try 和分配太多(或确保MySQL服务器配置有足够的 slack ).

因此,如果您使用值为60的setMaxTotal,并且您有两个正在运行的应用程序实例,这将意味着它们加在一起最多可以分配120个连接(当然,假设您的MySQL服务器最多有120个或更多连接,否则它将失败).


setMaxTotal是连接池将分配的连接的上限.这意味着,如果设置为60,它可以一次租用60个连接.如果应用程序在租用所有60个连接时调用DataSource.getConnection(),则该调用将等待配置的超时,以查看连接是否在该超时内变为可用,否则将抛出超时的异常.

如果连接池尚未达到最大总数,并且当前分配的所有连接都已租用,则它将创建一个新连接并分发该连接.

这就是为什么你的代码closes尽快建立连接是很重要的.关闭连接池中的连接是将其返回池以供重用.

Java相关问答推荐

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

我可以从Java模块中排除maven资源文件夹吗?

int Array Stream System. out. print方法在打印Java8时在末尾添加% sign

如何在Docker容器中使用wireock—Webhooks阻止请求?

空手道比赛条件

scanner 如何在执行hasNextLine一次后重新读取整个文件?

Select 按位运算序列

我需要生成一个文件来整合每个特性执行的所有JSON结果

对Java中的通配符参数的混淆

将响应转换为带值的键

用户填充的数组列表永不结束循环

Java SSLKeyManager出厂密码

在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

如何用内置Java从JavaFX应用程序中生成.exe文件?

如何使用MapStrCut转换双向链接

STREAMS减少部分结果的问题

Oracle中从JSON中提取和插入数据

关于正则表达式的一个特定问题,该问题与固定宽度负向后看有关

java.exe如何执行java源代码?