Play 1.2.5でJDBIを使用しようとしていますが、データベース接続が不足するという問題があります。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インスタンスを返すようにしましたが、同じ問題が発生しました。
私は何が間違っているのですか?