如何选择最大连接池大小?

inv*_*ant 4 java hibernate connection-pooling c3p0

<property name="hibernateProperties">
  <props>           
    <prop key="hibernate.c3p0.max_size">?</prop>
  </props>
</property>
Run Code Online (Sandbox Code Playgroud)

这只是随机数猜测吗?或者是否有任何研究建议针对特定用例使用特定范围?

Isa*_*aac 6

好吧,假设您正在谈论生产系统,那么“随机数猜测”绝对不是答案。实际上,“随机数猜测”永远不是生产环境中任何类型配置的答案。“仅接受产品的默认设置”也是如此。

连接池属性(例如max_size)取决于几个因素:

  • 预期用途。例如,如果您预计典型的使用模式为 10 个并发用户,偶尔会突然出现 20 个用户,那么将数字 50 设置为最大大小就没有什么意义,即使您认为您的计算机可以处理它。虽然乍一看似乎无害,但您必须记住,数据库连接是一种昂贵的资源,有时,您可能希望实际限制使用量以符合您的期望,即使只是将您自己的假设进行测试并了解真实的、类似于生产的系统使用模式,并防止您的应用程序成为资源消耗者,从而可能影响其他应用程序。

  • 可用资源。如果您知道(并且很容易验证)您的数据库一次只能接受 30 个连接,那么无论应用程序的使用模式如何,设置大于 30 的数字都是毫无意义的。

  • 应用设计。您的应用程序将主要使用短期连接吗?长期连接?您是否为 JDBC 调用设置了超时,以便您的 JDBC 调用一开始就有时间限制?例如,当您知道为每个操作设置 30 秒的超时时,您配置连接池的方式与知道您设置 2 分钟超时时定义连接池的方式有所不同。

  • 具体产品的考虑。我不确定c3p0,但某些提供连接池机制的容器将其自己的因素纳入其中。如果您正在使用容器提供的连接池功能,则应该阅读该容器的文档,以了解容器的供应商是否对配置他们为您提供的连接池机制有一定的了解。

...只是不要猜测数字。

...并且不要仅仅假设产品的默认设置。