Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在C3P0中配置连接存在性检查?_Java_Jpa_Jdbc_Connection Pooling_Jdbc Odbc - Fatal编程技术网

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

Java 如何在C3P0中配置连接存在性检查?,java,jpa,jdbc,connection-pooling,jdbc-odbc,Java,Jpa,Jdbc,Connection Pooling,Jdbc Odbc,我正在使用下面的代码来获得连接。我使用了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 cla

我正在使用下面的代码来获得
连接
。我使用了
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小时

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

<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>
5
20
3000
50
300
真的
选择1

在这里,如何在签出时执行相同的连接测试,以便在JDBC中也可以使用它?

C3P0文档中有一个很好的章节。另外,请参见,特别是优先规则一节

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

在代码中,只需添加

cpds.setTestConnectionOnCheckout( true );
cpds.setPreferredTestQuery( "SELECT 1" );
到您的
数据源
构造函数。确保查询实际上与数据库对话,我似乎想起了一些驱动程序实现,它们实际上并没有针对此类查询进入数据库:-)


干杯,

是的,没错。谢谢:)嗨,PeakGen,我面临的问题与您提到的关于关闭连接错误的问题相同,但这是在相当长的时间后发生的,而不是在8小时后。是否有任何配置设置,我可以检查,以确认对我来说,这似乎只是造成问题,因为我没有保持检查连接是否有效。非常感谢您的帮助。谢谢