4

私は次のようにConnectionPoolを使用してプールを作成しました:

データベースからgetConectionにいくつかのタックを作成し、それらを実行します。アプリケーションを3回だけ実行すると、アプリケーションが例外をスローします。

PoolableObjectFactory mySqlPoolableObjectFactory = new MySqlPoolableObjectFactory(
            host, dbName, user, password);
    Config config = new GenericObjectPool.Config();
    config.maxActive = 10;
    config.testOnBorrow = true;
    config.testWhileIdle = true;
    config.maxIdle = 5;
    config.minIdle = 1;
    config.maxWait = 10000;
    config.timeBetweenEvictionRunsMillis = 10000;
    config.minEvictableIdleTimeMillis = 60000;

    GenericObjectPoolFactory genericObjectPoolFactory = new GenericObjectPoolFactory(
            mySqlPoolableObjectFactory, config);
    return genericObjectPoolFactory.createPool();

public Connection getConnectionFromPool() {

    Connection conn = null;

    try {

        conn = (Connection) connPool.borrowObject();

    } catch (Exception e) {

        e.printStackTrace();

    }

    return conn;
}

しかし、私が多くのスレッドを実行すると。それは例外を投げます

java.util.NoSuchElementException: Timeout waiting for idle object
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
    at vn.vccorp.bigdata.mysql.AdmarketPool.getConnectionFromPool(AdmarketPool.java:76)
4

2 に答える 2

4
 config.maxWait = 10000;
 config.timeBetweenEvictionRunsMillis = 10000;
config.minEvictableIdleTimeMillis = 60000;

これらの設定を組み合わせても意味がありません。プールされたエントリを 10 秒間待機するだけで、10 秒ごとに削除するだけです。立ち退きは、それよりもはるかに頻繁に行う必要があります。これらのデフォルトは、それぞれ 30 秒と 5 秒です。

于 2012-08-03T07:25:51.927 に答える
2

コードを確認しましたが、場合によっては returnObject を見逃していました。ありがとうアンドレイ・ボリソフ

于 2012-08-03T07:34:34.133 に答える