我正在尝试将 JDBI 与 Play 1.2.5 一起使用,但我遇到了数据库连接不足的问题。我正在使用 H2 内存数据库(在 application.conf,db=mem 中)
我创建了类来获取使用 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 实例,但它总是包装相同的静态 DataSource 对象(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 实例,但出现了同样的问题。
我究竟做错了什么?