2012-08-03 16 views
5

を待っている私はこのようなのConnectionPoolを使用してプールを作成しました:タイムアウトがアイドルオブジェクトApacheの接続プールの

私は、データベースからgetConectionにいくつかのtaksを作成し、それらをexcute。私はアプリケーションを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; 
} 

しかし、私は多くのスレッドを実行します。これは、組み合わせて意味がありませんExeption

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) 
+3

returnObjectメソッドを使用してオブジェクトをプールに戻しますか? (!= nullのをconnの){ \t \t \t試し{ \t \t \t \t connPool.returnObject(CONN)場合ます。public void safeClose(接続CONN){ \t \tを使用して、私のSQLを終了した後 –

+0

はい、私なかれ近い接続。 \t \t \t}キャッチ(例外e){ \t \t \t \t e.printStackTrace(); \t \t \t \t \t \t} – phuongdo

答えて

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

これらの設定を投げます。プールされたエントリの場合は10秒間しか待機しませんが、10秒ごとにセッションを退去させています。撤退はそれよりずっと頻繁に起こる必要があります。これらのデフォルトはそれぞれ30秒と5秒です。

2

私は自分のコードをチェックしましたが、場合によってはreturnObjectが見つかりませんでした。ありがとうAndrey Borisov