2015-06-28 50 views
1

我在我的應用程序中使用帶有Dropwizard的JDBI。我已經使用dbi.open命令來獲取DAO實例,然後使用它來運行各種查詢。在「finally」塊中,我使用dao.close()方法關閉連接。我還使用dao.inTransaction方法在單個事務中執行多個DB語句。JDBI:比使用dbi.open更適合使用dbi.onDemand嗎?

雖然該應用程序已經工作了一段時間沒有太多問題,但最近我們在Dev和Prod env中看到了「PoolExhausted」異常多次。我現在想知道是否使用dbi.onDemand比使用dbi.open更好,這樣就可以避免每次最後都需要關閉......可能使用dbi.open是連接泄漏背後的原因?

回答

2

這取決於我們在打開和關閉連接之間所做的所有事情。

public interface UserDao { 
    @SqlQuery("select * from users") 
    public List<User> getUsers(); 

    @SqlUpdate(some query..) 
    public void insertUsers(someParam); 

} 

UserDao dao = dbi.onDemand(UserDao.class); 
dao.getUsers(); 

UserDao dao = dbi.open(UserDao.class); 
dao.getUsers(); 
dao.close(); 

這裏獲取連接和關閉連接沒有區別。

UserDao dao = dbi.onDemand(UserDao.class); 
dao.getUsers(); 
// calling external service to get some value. 
dao.insertUsers(); 

UserDao dao = dbi.open(UserDao.class); 
dao.getUsers(); 
// calling external service to get some value. 
dao.insertUsers(); 
dao.close(); 

在此示例中,在onDemand方法中,連接在getUsers調用並在此之後關閉之前打開。 對於insertUsers也是如此。在外部服務呼叫期間,不保持連接。

在Dbi open方法中,連接在getUsers之前打開並在insertUsers之後關閉。在外部服務呼叫期間,連接也被保持。 如果這個外部通話費用很高,那麼你最終會連接空閒很長時間,而不能用於其他通話。

所以最好使用onDemand來獲取Dao實例。