我在Web应用程序中使用了Hibernate。
并使用了C3P0连接池机制。
我的配置如下所示,要检查其是否正常工作,我将max_size和min_size设置为0。理想情况下,我认为如果它为0,则它不应给我任何连接,并且应该引发错误/异常。但是它没有做任何这样的事情。它正常工作。
因此,如何确定给定的C3P0相关配置是完美的配置?
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/reg</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="connection.autocommit">false</property>
<!-- Connection pooling configuration -->
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">1</property> <!-- seconds -->
<property name="c3p0.max_size">0</property>
<property name="c3p0.max_statements">0</property>
<property name="c3p0.min_size">0</property>
<property name="c3p0.timeout">200</property> <!-- seconds -->
<property name="hibernate.show_sql">false</property>
最佳答案
这取决于您正在构建的应用程序。
使用数据库连接池的原因如下:
获取数据库连接是一项昂贵的操作。
您的资源有限,因此一次只能打开有限数量的数据库连接。
并非服务器正在处理的所有用户请求都在执行数据库操作,因此您可以在请求之间重用数据库连接。
由于获取新连接的成本很高,因此应将min_size保持为非零。根据轻度使用应用程序期间的负载,您可以在此处进行合理的猜测。通常,在大多数示例中指定5。
acquisition_increment取决于使用您的应用的用户数量增长的速度。因此,想象一下,如果您每次需要一个额外的连接时都要求一个新的连接,则您的应用程序可能会运行不佳。因此,在预期用户数量激增的情况下,您可能希望增加更大的块,例如5或10或更多。
通常,最大您拥有的数据库连接数可以少于使用您的应用程序的并发用户数。但是,如果您的应用程序占用大量数据库资源,则可能必须配置max_size来匹配您拥有的并发用户数。
有时候,即使将max_size设置得很高,您也可能无法处理这么多用户。到那时,您将不得不考虑重新设计应用程序以避免数据库负载。通常,这是通过将读取操作卸载到仅提供读取操作的备用数据库实例来完成的。同样,人们采用这种数据的缓存,这种数据不经常改变但是经常被读取。
类似的理由也可以应用于其他领域