0

Apache Commons DBCP に問題があります。プールは機能しますが、ランダムな時間 (時間) の前に、ループで停止します。Java にスレッドがあり、そのうちの 1 つが 15 秒のスリープで DB に接続します。このスレッドは、ランダムな時間が機能を停止する前に停止しますが、強制終了されず、無限ループで接続を待機して一時停止されます。

これは、私の 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 プールが動作を停止する前に、SQL 例外があり、この例外がキャプチャされましたが、プールが動作を停止していることを発見しました。

4

1 に答える 1

0

最新の jar (commons-dbcp-1.4) を使用してみてくださいsetValidationQueryTimeoutを使用します

SQL クエリのクエリ タイムアウトを設定します。

于 2013-04-08T11:09:21.877 に答える