作为问题,我将描述我们当前的生产环境。
我已将c3p0配置为最小连接池大小为1,增量值为3,最多为20个连接。所以我的问题是,我与MySQL的最大连接应该是什么?它应该是最大池大小乘以客户端数量(20 * 300 = 6000)吗?还是应该少一点?如果c3p0已经说过,3个连接已经尝试获取另一个并且MySQL处于最大值,那么会发生错误吗?
我认为并非所有客户都需要同时使用最大数量,但我确实希望防止发生边缘情况时发生任何错误。
答案 0 :(得分:1)
理论上,正如你所说,你的MySQL最多可以看到6000个连接,所以为了安全起见,这就是答案。
但你真的不希望它打开6000个连接。如果每个池的minPoolSize为1,maxPoolSize为20,那么听起来好像您希望客户经常处于静止状态,但偶尔使用时会出现飙升。除非峰值可能在时间上高度相关,否则通常的负载应该更低,更低。
默认情况下,c3p0连接池会随着加载峰值而快速增长,但不会衰减。如果您在c3p0池上设置了激进的maxIdleTime或更好的maxIdleTimeExcessConnections,则可以确保静止池保持少量连接并降低您接近理论最大值6K的可能性。
对于MySQL设置,您可以将其设置为6K以保证安全,或者将其设置得低得多,以便在您过度使用DBMS时看到错误而不是迟缓。最好估计您期望的峰值使用率,将MySQL max设置为可能加倍,并查看是否显着违反了负载预期(即,如果因为DBMS拒绝连接而发生错误)。
有300个不同的数据库,这意味着300个c3p0数据源,这可能会导致线程和线程管理的高开销。 c3p0' numHelperThreads
默认为3,你不想低于此值。所以,这是值得考虑的事情。