【发布时间】:2012-08-24 05:34:07
【问题描述】:
我对 Apache Commons DBCP 有疑问。 池工作,但在随机时间(小时)之前,这会停止循环。 我有 Java 线程,其中一个以 15 秒的睡眠时间连接到数据库。 这个线程,在随机时间停止工作之前,但没有被杀死,并且在无限循环中暂停等待连接。
这是我的 DBCP 配置的附件:
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(_configuracion.getClassName());
basicDataSource.setUsername(_configuracion.getUser());
basicDataSource.setPassword(_configuracion.getPassword());
basicDataSource.setUrl("jdbc:mysql://" + _configuracion.getSocket() + "/" +
_configuracion.getNombreBd());
basicDataSource.setValidationQuery("SELECT 1");
basicDataSource.setTestOnBorrow(true);
basicDataSource.setTestWhileIdle(true);
basicDataSource.setTestOnReturn(false);
basicDataSource.setTimeBetweenEvictionRunsMillis(1000 * 60 * 15);
basicDataSource.setMinEvictableIdleTimeMillis(1000 * 60 * 2);
basicDataSource.setNumTestsPerEvictionRun(10);
basicDataSource.setRemoveAbandoned(true);
basicDataSource.setRemoveAbandonedTimeout(60 * 60);
_dataSource = basicDataSource;
_dataSource 属性是我的数据库类的静态属性,该类是为线程调用的。
private static DataSource _dataSource;
我不知道我的 DBCP 配置是否有问题。
请帮帮我!
编辑:这是使用 DataSource 的代码。
public CachedRowSet query(String sql) {
CachedRowSet datos = null;
Connection con;
ResultSet rs;
try {
con = _dataSource.getConnection();
Statement sentencia = con.createStatement();
rs = sentencia.executeQuery(sql);
datos = new CachedRowSetImpl();
datos.populate(rs);
rs.close();
sentencia.close();
con.close();
} catch (Exception ex) {
System.out.println("Error: " + ex.getMessage());
}
return datos;
}
我发现在 DBCP Pool Stop Working 之前,它有一个 SQL Exception,这个 Exception 被捕获,但是 Pool Stop Working。
【问题讨论】:
-
您也应该发布实际使用数据源的代码。
标签: multithreading connection-pooling apache-commons infinite-loop apache-commons-dbcp