我使用以下代码获取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时,有一些配置可以测试连接并重新建立连接。我所做的配置在
之下<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中使用它?
答案 0 :(得分:3)
C3P0文档中的configuring connection testing有一个很好的部分。另请参阅configuration override部分,特别是优先规则。
(特别是,关于使用支持isValid()
的JDBC4驱动程序的建议很好。)
在您的代码中,您只需添加
即可cpds.setTestConnectionOnCheckout( true );
cpds.setPreferredTestQuery( "SELECT 1" );
到你的DataSource
构造函数。确保查询实际上与数据库对话,我似乎回想起一些驱动程序实现,这些实现并没有真正进入数据库进行某些类型的查询: - )
干杯,