web-dev-qa-db-ja.com

接続プールはスレッドへの接続を許可できませんでした

Androidでのデータベース処理にGreenDAOを使用しています。多くのデータベース変更(> 15.000)を実行すると、次のエラーメッセージが表示されます。

データベース '/ data/data/...'の接続プールは、30.000002秒間、フラグ0x1のスレッド312(Thread-312)への接続を許可できませんでした。

すべてが行き詰まっています。なぜこのエラーが発生するのですか?

30
Basic Coder

この特定の実装についてははっきりとは言えませんが、通常ORMをサポートする接続プールがあります。接続プールは、データベースへの設定された数の接続を開き、それらを閉じて新しい接続を開くときにそれらをリサイクルします。そのエラーが伝えていることは、おそらく限界に達しているということです。これはさまざまな理由で発生する可能性があります。1つは、2つのテーブルを更新していて、2つの異なるトランザクションが、別のテーブルが解放されるのを待機している異なるテーブルを保持しているため、DBにデッドロックが発生している可能性があります。または、単に開いている接続が多すぎて、DBまたは接続プールが混乱するだけです。

申し訳ありませんが、実際の回答ではありませんが、GreenDAOのドキュメントを参照して、これがどのように発生するかを確認する必要があります。

11
Kaediil

以前にトランザクションが終了せずにトランザクションで使用されているテーブルでクエリを選択するときに、このメッセージが表示されました。トランザクションの最終ブロックでendTransaction()を実行した後に問題が解決しました。

34
hkutluay

DBFlow FlowQueryListを介してSQLiteへの接続を作成しすぎると、このメッセージが表示されました。私の解決策は、クエリリストを使い終わったら、クエリリストでendTransactionAndNotify()を呼び出し、次にclose()を呼び出すようにすることでした。

endTransactionAndNotify()を単独で呼び出しても効果はありません。これが役に立てば幸いです。このスレッドは確かに私を助けました。

1
Blaze Gawlik