java - 如何在 C3P0 中配置连接存在性检查?

标签 java jpa jdbc connection-pooling jdbc-odbc

我正在使用下面的代码获取Connection。我已将 c3p0 库用于连接池。

package com.dataSource.c3p0;

import java.beans.PropertyVetoException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSource {

    private static DataSource     datasource;
    private ComboPooledDataSource cpds;

    private DataSource() throws IOException, SQLException, PropertyVetoException {
        cpds = new ComboPooledDataSource();
        cpds.setDriverClass("com.mysql.jdbc.Driver"); //loads the jdbc driver
        cpds.setJdbcUrl("jdbc:mysql://localhost/test");
        cpds.setUser("root");
        cpds.setPassword("root");

        // the settings below are optional -- c3p0 can work with defaults
        cpds.setMinPoolSize(5);
        cpds.setAcquireIncrement(5);
        cpds.setMaxPoolSize(20);
        cpds.setMaxStatements(180);

    }

    public static DataSource getInstance() throws IOException, SQLException, PropertyVetoException {
        if (datasource == null) {
            datasource = new DataSource();
            return datasource;
        } else {
            return datasource;
        }
    }

    public Connection getConnection() throws SQLException {
        return this.cpds.getConnection();
    }

}

现在我的问题是,这段代码没有检查连接是否存在。这很可能会在 8 小时后遇到著名的连接关闭错误。

当我将 C3P0 与 hibernate 一起使用时,有一些配置可以测试连接并重新建立它。我做的配置如下

<property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">3000</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_period">300</property>
    <property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
    <property name="hibernate.c3p0.preferredTestQuery">SELECT 1</property>

我怎样才能在结帐时进行相同的连接测试,以便我也可以在 JDBC 中使用它?

最佳答案

configuring connection testing 上有一个很好的部分在 C3P0 文档中。另请参阅有关 configuration override 的部分,特别是优先规则。

(特别是,关于使用支持 isValid() 的 JDBC4 驱动程序的建议很好。)

在您的代码中,您可以简单地添加

cpds.setTestConnectionOnCheckout( true );
cpds.setPreferredTestQuery( "SELECT 1" );

到您的 DataSource 构造函数。确保查询实际上与数据库对话,我似乎记得一些驱动程序实现实际上并没有针对此类某些查询进入数据库 :-)

干杯,

关于java - 如何在 C3P0 中配置连接存在性检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30521146/

相关文章:

java - 如何让 Eclipse 编译 WEB-INF/classes 中的 java 文件

java - 如何在 Camel 处理器中使用属性占位符

java - 如何让bean持久化?

java - 在 JPA 2 Criteria API 中选择 DISTINCT + ORDER BY

java - JPA:反向级联删除

sql-server - jTDS 套接字挂起并进行 C3P0 连接检查 (SQL Server 2008 R2)

android - 在 android studio 中使用 JDBC 无法从 mySQL 检索数据

java - 鉴于这种情况(请参阅内部),是否值得使用 Hibernate?

java - 使用 Axon CQRS 更改事件类别

Swing 中的 Java 继承/重用能力