c3p0的最佳配置

时间:2012-09-20 06:20:06

标签: java hibernate jpa-2.0 connection-pooling c3p0

我正在努力解决面临c3p0配置的问题。 I posted a question last week

2 个答案:

答案 0 :(得分:48)

这是我正在使用的配置,可以将资源保持在最低限度。当然,您想要定制您的应用程序以使用它所需的资源......

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

  • testConnectionOnCheckin在连接返回池时验证连接。 testConnectionOnCheckOut,尽管在使用前确保活动连接,但这样做太昂贵了。
  • idleConnectionTestPeriod设置连接在测试之前保持空闲的时间限制。如果没有preferredTestQuery,默认值为DatabaseMetaData.getTables() - 这与数据库无关,虽然相对昂贵的调用,对于相对较小的数据库来说可能很好。如果您对性能产生偏执,请使用特定于您的数据库的查询(即preferredTestQuery="SELECT 1"
  • maxIdleTimeExcessConnections会在活动激增后将connectionCount恢复为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>

答案 1 :(得分:2)

最佳配置是设置JPA以使用容器环境来获取DataSource。

这允许容器提供连接池,而不是直接将其配置到JPA项目中。

您没有指明您正在使用哪个容器环境。我几乎总是将c3p0用于独立应用程序,例如Java SE桌面或服务器应用程序。我也在Spring框架中使用它。

当使用诸如Servlet(Tomcat / Jetty)或Application Server(例如Glashfish或JBoss AS)之类的容器时,这些已经提供了一个通常不是c3p0但提供等效功能的DataSource连接池实现。

我从未尝试在JPA项目中配置连接池,因为这意味着编辑配置以针对它需要运行的每个环境对其进行自定义。这是一个令人头痛的问题,因此最好让JPA部分在数据源期间使用自举。