2012-08-03 14 views
5

Stworzyłem puli instrumentów, pula połączeń tak:Timeout czekając bezczynnie obiekt połączenia Apache Pool

tworzę jakieś ło do getConection z bazy danych i excute im. Moja aplikacja jest uruchamiana tylko 3 razy, moja aplikacja zgłasza wyjątek.

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; 
} 

Ale kiedy uruchomię wiele wątków. To rzucać 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

czy zwracasz obiekty do puli za pomocą metody returnObject? –

+0

Tak, sprecyzowane ścisły związek po ukończeniu SQL przy użyciu public void safeClose (Connection conn) { \t \t if (conn = null!) { \t \t \t try { \t \t \t \t connPool.returnObject (conn); \t \t \t} zaczep (wyjątek e) { \t \t \t \t w.printStackTrace(); \t \t \t} \t \t} \t} – phuongdo

Odpowiedz

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

Ustawienia te nie mają sensu w połączeniu. Odczekasz tylko 10 sekund na wejście w pulę, ale będziesz je eksmitował co 10 sekund. Ekscesje muszą występować znacznie częściej. Domyślne wartości to odpowiednio 30 sekund i 5 sekund.

2

Sprawdziłem mój kod, w niektórych przypadkach opuściłem returnObject. Dzięki Andrey Borisov