“setMaxTotal”实际上是做什么的? (MySQL & Java & Apache 的 BasicDataSource 连接池)

问题描述 投票:0回答:1

在AWS上有一个MySQL数据库,我发现它允许的最大连接数是

60
,当执行
show variables like 'max_connections'
时:

因此,当使用 Apache 的 javax.sql.DataSource 实现作为我的连接池时,我可以将 活动连接的最大数量设置为 60。

...

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

但是,有时我的代码中仍然会遇到

TooManyConnectionsDatabaseException
异常。

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

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

客户端的连接池是否会创建一个400的内部队列并暂停/睡眠400个连接线程?

或者无论设置最大连接数如何,它都会尝试向 MySQL 数据库发送 500 个请求吗? (如果是这样,限制的意义何在)

或者它会抛出其他 400 个连接的编码异常吗?

设置连接池最大活跃连接数到底有什么作用?

java connection-pooling
1个回答
0
投票

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

setMaxTotal
仅涉及连接池的特定实例,它不跟踪或监视服务器允许的连接数:您有责任适当配置它(或MySQL服务器),而不是尝试分配太多(或者保证MySQL服务器配置有足够的余量)。

因此,如果您使用值为 60 的

setMaxTotal
,并且您有两个正在运行的应用程序实例,则意味着它们最多可以分配 120 个连接。

© www.soinside.com 2019 - 2024. All rights reserved.