2012-08-03 77 views
5

我創建使用連接池這樣的池:超時等待空閒對象阿帕奇連接池

我創建一個從數據庫中的一些TAKS到getConection和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方法返回對象池嗎? – 2012-08-03 07:07:16

+0

是的,我整理使用公共無效safeClose(康涅狄格州連接) \t \t如果我的SQL {之後送花兒給人緊密連接(參數conn!= NULL){ \t \t \t嘗試{ \t \t \t \t connPool.returnObject(康涅狄格州); \t \t \t}趕上(例外五){ \t \t \t \t e.printStackTrace(); \t \t \t} \t \t} \t} – phuongdo 2012-08-03 07:15:37

回答

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

這些設置沒有意義的組合。您只會等待10秒鐘才能進行彙總輸入,但您每10秒只能逐出它們。驅逐需要比這更頻繁地發生。這些默認值分別是30秒和5秒。

2

我檢查了我的代碼,在某些情況下我錯過了returnObject。謝謝安德烈鮑裏索夫

相關問題