我在我的 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。
acquire_increment 取决于使用您的应用的用户数量增加的速度。因此,想象一下,如果您每次需要额外连接时都请求 1 个新连接,您的应用程序可能会表现不佳。因此,预计用户会爆发,您可能希望增加更大的 block ,例如 5 或 10 或更多。
通常,最大。您拥有的数据库连接数可能少于使用您的应用程序的并发用户数。但是,如果您的应用程序是数据库密集型的,那么您可能必须配置 max_size 以匹配您拥有的并发用户数。
有时,即使将 max_size 配置得非常高,您也可能无法处理如此多的用户。那时您将不得不考虑重新设计您的应用程序以避免数据库负载。这通常是通过将读取操作卸载到仅提供读取操作的备用数据库实例来完成的。此外,我们还对这些不经常更改但经常读取的数据进行缓存。
类似的理由也适用于其他领域
关于java - Hibernate C3P0 池机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17319868/