2012-07-31 13 views
22

私はAndroidでデータベース処理にGreenDAOを使用しています。接続プールはスレッドへの接続を許可できません

データベース '/ data/data/...'の接続プールがスレッド312(スレッド312)に接続を許可できませんでした。 )を30.000002秒間0x1のフラグで置き換えます。

すべてがスタックします。このエラーはなぜ発生しますか?

+0

この問題に関する詳細をご提供ください。例えば。スタックトレース、それはテストされたすべてのデバイス上で発生しますか?、Androidのバージョンがテストされた... –

+0

私は同じ問題を抱えています。スタックトレースはありません。同じエラーが繰り返され、データベースにアクセスできなくなりました。私はGreenDaoのどこかにオープントランザクションがありますが、finally節にトランザクションが終了していないのだろうかと思います。 – Hiep

答えて

8

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

申し訳ありませんが実際には答えはありませんが、GreenDAOのドキュメントを見て、これがどうなるかを確認する必要があります。

+1

greenDAOは接続プール自体を使用しません。 greenDAOのアプリは、SQLiteを使用するAndroidアプリと同じように動作します。いくつかの種類のSQLiteOpenHelperを使用してSQLiteDatabaseを取得します。 DaoMaster/DaoSessionのインスタンスは、このSQLiteDatabaseオブジェクトを参照します。 –

32

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

+1

また、大きなデータセットをインポートする際にバッチを作成することも考えてください。さあ、 'endTransaction()'を行い、n個のエンティティの後に新しいトランザクションを開始してください。 – melbic

0

DBFlow FlowQueryList経由でSQLiteへの接続が多すぎると、このメッセージが表示されます。私の解決策はクエリーリストでendTransactionAndNotify()を呼び出し、クエリーリストにclose()を呼び出すようにクエリリストを完了したことを確認することでした。

endTransactionAndNotify()だけを呼び出すと、このトリックは実行されませんでした。 私はこれが助けてくれることを願っています。このスレッドは確かに私を助けました。

関連する問題