c3p0的最佳配置是什么?

39
2个回答

50

这是我使用的配置,可以将资源最小化。当然,你需要根据自己的应用程序来定制它所需的资源...

参考资料http://www.mchange.com/projects/c3p0/index.html

  • testConnectionOnCheckin 在连接返回池时验证连接。testConnectionOnCheckOut 虽然会确保在使用之前激活连接,但成本过高。
  • idleConnectionTestPeriod 设置了测试连接空闲时间的限制。如果没有 preferredTestQuery,则默认是 DatabaseMetaData.getTables()—虽然这是与数据库无关的相对昂贵的调用,但对于比较小的数据库可能还好。如果你对性能非常敏感,请使用特定于你的数据库的查询(例如: preferredTestQuery="SELECT 1")。
  • maxIdleTimeExcessConnections 将在活动量激增后将连接数降至 minPoolSize

以下配置将池大小设置为3-20。空闲连接每5分钟重新测试一次以保持其活动状态。由于有 idleConnectionTestPeriod,这只会保留最小数量的连接。如果在4分钟时有超过3个连接,则会关闭这些连接,将资源释放回到最小值。

使用 maxIdleTimeExcessConnectionsidleConnectionTestPeriod 可以避免需要 maxIdleTime

<Context docBase="myapp" path="/myapp" reloadable="true">
    <Resource description="My DB Datasource" name="jdbc/mydb"
        auth="Container" factory="org.apache.naming.factory.BeanFactory"
        type="com.mchange.v2.c3p0.ComboPooledDataSource" 
        user="myuser" password="******"
        minPoolSize="3"
        maxPoolSize="20"
        acquireIncrement="1" 
        driverClass="com.mysql.jdbc.Driver" 
        jdbcUrl="jdbc:mysql://localhost:3306/mydb"
        testConnectionOnCheckin="true" 
        idleConnectionTestPeriod="300"
        maxIdleTimeExcessConnections="240"
    />
</Context>

感谢您的回答,Domenic。我已经阅读了您指出的参考文献,并且我知道c3p0属性的行为,但在我的项目中-我认为-这些属性-即我在另一篇帖子中提到的配置-没有任何作用,因为它们不处于完美状态,需要其他属性或必须设置在另一个配置文件中。 - Babak Behzadi
@Domenic:我遇到了同样的问题,无法创建新连接。这是我的所有细节。我觉得你可以在我的c3p0中找出问题所在。 http://stackoverflow.com/questions/38994849/unable-to-get-jdbc-connection-even-pool-shows-only-few-connections-are-used - Muhammad Zeeshan
这似乎很有帮助,但是我有些困惑。 idleConnectionTestPeriod大于maxIdleTimeExcessConnections,因此连接将在测试之前被逐出。这是正确的吗?因此,任何闲置连接都不会被测试,因为它们已经被丢弃了...请在这里提供帮助@Domenic.D。 - ronit
@ronit,你说得大多数正确。idleConnectionTestPeriod 用于保持与 minPoolSize 定义的少数剩余连接的连接状态。可以将其视为白天主要使用的数据库。在一天中的其他时间,我们只需在 4 分钟后终止空闲连接,但在晚上,我们每隔 5 分钟测试 3 个剩余的空闲连接,以确保它始终可用。 - Domenic D.
你好。你的语句“使用maxIdleTimeExcessConnections和idleConnectionTestPeriod可以避免maxIdleTime的需要”让我很好奇。在我们的应用程序中,我们将maxIdleTime设置为120秒,而idleConnectionTestPeriod设置为300秒。这是否意味着空闲连接可能不总是在达到120秒时被清除?请澄清一下。 - asgs
那是我的理解。如果您每300秒测试一次连接,则maxIdleTime如果小于300,则无关紧要。 - Domenic D.

2
最佳配置是设置JPA使用容器环境来获取DataSource。
这使得容器提供连接池,而不是将其直接配置到您的JPA项目中。
您没有说明您正在使用哪个容器环境。我几乎总是在独立应用程序(如Java SE桌面或服务器应用程序)中使用c3p0。我也在Spring框架中使用它。
当使用Servlet(Tomcat/Jetty)或应用程序服务器(例如Glashfish或JBoss AS)等容器时,它们已经提供了一个DataSource连接池实现,通常不是c3p0,但提供了等效功能。
我从未尝试在JPA项目内配置连接池器,因为这意味着编辑配置以使其适合需要运行的每个环境。这很麻烦,所以最好在引导期间将DataSource提供给JPA部分使用。

谢谢你的回答。我正在使用hibernate3.0,c0p3-0.9.1和Tomcat。你有没有配置连接池策略的示例?如果你过去的经验可以帮助避免MySQL在8小时后断开空闲连接,那对我来说将是受欢迎的。 - Babak Behzadi
即使MySQL在8小时后断开空闲连接,c3p0也可以配置为始终在使用之前测试连接,以及在空闲时保持测试。您是否在StackOverflow上搜索了该信息?http://stackoverflow.com/questions/10526313/zombie-connections-to-mysql-using-c3p0-with-tomcat(还有许多其他参考资料,您需要从告诉Tomcat不使用C3P0开始,然后设置WAR部署所需的参数,然后更改JPA项目以使用JNDI查找)。 - Darryl Miles
我知道测试连接是有帮助的,我也有c3p0的配置,但我不确定这些配置是否正确且可用。请看一下我的最后一个问题stackoverflow.com/questions/12446266/c3p0-configurations-where-and-how - Babak Behzadi
我不认为在应用服务器内配置池有任何优势。对于一个应用程序而言,只需编辑一次配置并不会让我感到头疼。 - Janning Vygen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接