在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 个连接的编码异常吗?
设置连接池最大活跃连接数到底有什么作用?
setMaxTotal
设置连接池的特定实例可以创建的连接数。如果您将其设置为 60,并且您的服务器也最多有 60 个,则它可能会工作,或者如果还有其他东西创建连接(例如监控工具、应用程序的其他实例等),则可能会失败。
setMaxTotal
仅涉及连接池的特定实例,它不跟踪或监视服务器允许的连接数:您有责任适当配置它(或MySQL服务器),而不是尝试分配太多(或者保证MySQL服务器配置有足够的余量)。
因此,如果您使用值为 60 的
setMaxTotal
,并且您有两个正在运行的应用程序实例,则意味着它们最多可以分配 120 个连接。