39

我正在努力解决面临 c3p0 配置的问题。我上周发布了一个问题

4

2 回答 2

50

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

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

  • testConnectionOnCheckin当连接返回到池时验证连接。testConnectionOnCheckOut,虽然可以确保在使用前进行活动连接,但这样做成本太高。
  • idleConnectionTestPeriod设置连接在测试之前保持空闲的时间限制。如果没有 preferredTestQuery,默认值为DatabaseMetaData.getTables()- 与数据库无关,虽然调用成本相对较高,但对于相对较小的数据库来说可能没问题。如果您对性能有疑虑,请使用特定于您的数据库的查询(即preferredTestQuery="SELECT 1"
  • maxIdleTimeExcessConnectionsminPoolSize将在活动高峰后将connectionCount 恢复到。

下面的配置将 poolsize 设置在 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>
于 2012-09-21T13:21:37.350 回答
2

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

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

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

当使用诸如 Servlet (Tomcat/Jetty) 或应用程序服务器(如 Glashfish 或 JBoss AS)之类的容器时,它们已经提供了通常不是 c3p0 但提供等效功能的 DataSource 连接池实现。

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

于 2012-09-20T07:04:20.203 回答