1

複数のスレッドからアクセスされるかなり大きなデータベースを保持する Android アプリケーションがあります。データベース ロック例外が発生し始めています。私の質問は、データベース キュー (iOS の FMDataBase.Queue に似ています) を作成する方法はありますか?

私はいくつかの調査を行いましたが、多くのデータベースクエリと挿入が異なるため、ヘルパークラスを作成したくないため、クエリごとにメソッドを作成することは現実的ではありません。

私は置くことができました

if(!db.isLocked)
{
    //exec(BLAH)
}
 else
{
  //try{thread.sleep(1000);}... then some retry code
}

すべてのデータベース機能についてですが、これよりも良い方法があるはずです。

さらに、スレッドが 1000 ミリ秒スリープした後にスレッドがロックされた場合でもクラッシュし、データベースが 10 ミリ秒ロックされている場合、クエリが実行されるまで 990 ミリ秒待機することになります。

データベースがロック解除されると、データベースに送信されたコマンドが実行されるようにキューを作成することは可能ですか?

どんなアドバイスでも大歓迎です

4

1 に答える 1

1

私の質問は、データベース キューを作成する方法はありますか

すべてのデータベース書き込みを 、IntentServiceをホストする通常のサービス、シングルトンが保持するLinkedBlockingQueueなどに移動します。LinkedBlockingQueueSQLiteOpenHelper

私のデータベースクエリと挿入の多くは異なるため、クエリごとにメソッドを作成することは現実的ではありません。

データベースI/Oをメソッドにラップするオーバーヘッドは、質問で提案していたものよりも特に多くはありません。

データベースが 10 ミリ秒ロックされている場合、クエリが実行されるまで 990 ミリ秒待機することになりますが、これはユーザー エクスペリエンスにはあまりよくありません。

データベース アクセスを調整します (EXPLAINキーワード、適切なインデックスの設定など)。Traceview を使用して、問題がどこにあるかを正確に特定します。問題がデータベース トランザクションにある場合 (たとえば、独自のトランザクションを開き、その中で大量の作業を行っている場合)、 の使用をyieldIfContendedSafely()検討してください。

于 2013-11-03T16:50:50.637 に答える