2

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インスタンスを返すようにしましたが、同じ問題が発生しました。

私は何が間違っているのですか?

4

2 に答える 2

1

ええと。withHandle()を使用していない古いコードで接続がリークしていたことが判明しました。アップグレードするとすぐに問題は止まりました

于 2013-01-06T13:04:45.280 に答える
0

公式ドキュメントから

ハンドルは開いた接続を保持するため、使い終わったら各ハンドルが閉じていることを確認するように注意する必要があります。ハンドルを閉じないと、最終的に開いている接続でデータベースを圧倒したり、接続プールを使い果たしたりします。

コールバック関数が提供されたときにハンドルが閉じることを保証するものではないことがわかりました。

于 2020-01-30T00:45:07.830 に答える