2013-01-06 46 views
2

我试图使用JDBI与Play 1.2.5和即时通讯有数据库连接用完的问题。我使用H2内存数据库(在application.conf,DB = MEM)Playframework 1.2.5和JDBI

我已经创建的类来获得使用Play的DB.datasource像这样jdbi实例:

public class Database {  
    private static DataSource ds = DB.datasource; 

    private static DBI getDatabase() {  
     return new DBI(ds);  
    } 

    public static <T> T withDatabase(HandleCallback<T> hc) { 
     return getDatabase().withHandle(hc);  
    } 

    public static <T> T withTransaction(TransactionCallback<T> tc) { 
     return getDatabase().inTransaction(tc); 
    } 
} 

每次我做一个数据库调用,一个新的DBI实例被创建,但它总包相同的静态数据源对象(play.db.DB.datasource)

请告诉我发生的事情是,我得到了以下一段时间后:

CallbackFailedException occured : org.skife.jdbi.v2.exceptions.UnableToObtainConnectionException: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

我很困惑,因为DBI.withHandle()和DBI.withTransaction()的全部要点是在回调方法完成时关闭连接并释放资源。

我也试过让getDatabase()每次都返回相同的DBI实例,但是同样的问题发生了。

我在做什么错?

回答

1

Duh。原来我在一些旧的代码中使用withHandle()来泄漏连接。只要我升级它,问题就停止了

+0

你升级了什么? – hatellla

+0

在我意识到withHandle()之前,我写了一些自己的代码 –