2012-08-03 36 views
5

Tôi đã tạo một Bể bơi bằng cách sử dụng ConnectionPool như sau:Hết giờ chờ đối tượng nhàn rỗi Kết nối Apache Pool

Tôi tạo một số taks để getConection từ cơ sở dữ liệu và thực hiện chúng. Tôi chỉ chạy ứng dụng của tôi chỉ 3 lần, ứng dụng của tôi ném ngoại lệ.

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

Nhưng khi tôi chạy nhiều chuỗi. Nó ném 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

bạn có trả lại các đối tượng cho nhóm bằng phương thức returnObject không? –

+0

Vâng, tôi kết nối nhất luôn gần gũi sau khi kết thúc sql của tôi sử dụng public void safeClose (kết nối conn) { \t \t if (conn = null) { \t \t \t try { \t \t \t \t connPool.returnObject (conn); \t \t \t} bắt (Ngoại lệ e) { \t \t \t \t e.printStackTrace(); \t \t \t} \t \t} \t} – phuongdo

Trả lời

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

Các thiết lập này không có ý nghĩa kết hợp. Bạn sẽ chỉ chờ 10 giây cho một mục nhập gộp, nhưng bạn chỉ đuổi chúng mỗi 10 giây. Những điều cần phải xảy ra thường xuyên hơn nhiều. Giá trị mặc định cho các giá trị này là 30 giây và 5 giây tương ứng.

2

Tôi đã kiểm tra mã của mình, tôi đã bỏ lỡ returnObject trong một số trường hợp. Cảm ơn Andrey Borisov

Các vấn đề liên quan