如何确定连接池中所需的连接数?

Sha*_*shi 6 java database hibernate connection-pooling c3p0

我在我的应用程序中使用hibernate 3.2.2.对于连接池,我们使用的是c3p0 0.9.1.我在View模式中使用Generic DAO Pattern和Open Session来进行数据库操作.
我们正在开发现有网站的新网站.现在,在现有应用程序中,访问次数为50万次.我对c3p0配置感到困惑.在什么基准,我决定打开连接的否定.最大连接,最小连接,空闲时间,超时等....

And*_*yle 3

您首先需要确定如果请求传入且没有可用连接为其提供服务,池将执行什么操作。它会抛出异常吗?返回空值?阻塞直到另一个连接返回到池中?

一旦您知道超出容量时会发生什么,请考虑如何在调用代码中处理这种情况,以及在什么情况下可以接受这种情况发生。在某个时刻,随着连接数量的增加,您将不得不开始拒绝服务某些请求,但只有您可以决定那个点是什么。实际点取决于很多因素,包括诸如

  • 您当前的空闲和忙碌请求率
  • 这些利率的波动性(如果利率波动很大,你需要更多的“喘息空间”)
  • 与硬件改进相比,未来容量增长的任何预测以及修改此代码的开发人员时间预算(如果您计划在几个月内升级它,那么您需要的开销比打算继续运行几年的开销要少)
  • 贵公司对处理能力做出的任何保证
  • 客户端理解“稍后重试”请求的能力 - 例如,如果您知道另一端有一个自动脚本在 503 上休眠一分钟并重试,这比人类收到“暂时超出容量”消息要好两者都比获得非 200 响应并因错误退出的批处理脚本要好得多。
  • 请求的紧迫性 - 某些请求(查看小猫的图片)可以合理地延迟,但其他请求(股票交易订单)可能对时间非常敏感。

等等等等。

希望根据上面的内容,您应该能够得出需要能够同时处理的请求数量(如果存在不同类型的请求,您可能也需要考虑这一点)。然后,只需查看传入请求如何获取和使用连接、推理和分析,直到发现池中维持目标连接速率所需的连接数。

不要忘记考虑诸如非请求线程(例如工作池)从同一个池获取自己的连接(池需要更大)之类的事情,以及仅在执行过程中保留连接的请求(池可以更小)。