2012-02-19 8 views
1

DB上で複数のスレッドが動作する可能性がある場合、SQLiteを使用する方法を理解しようとしています。 複数のスレッドから同じsqlitehelperインスタンスを使用すると、stackoverflowや他のサイトのさまざまな応答に基づいて、ロックの問題が発生するように見えます。典型的なJavaアプリケーションでは、インスタンスは、sqliteヘルパーの単一のオブジェクトがアプリケーションの別のスレッドで使用されることを意味すると考えています。そのような場合、ロックは、同期ブロックを正しく使用することの問題です。 [sqliethelperインスタンスを見ているこの方法に慣れていないのでここで修正してください]AndroidのSQLite:複数のスレッドからのロック+アクセス

私の懸念は同じデータベースを共有することです:sqliteヘルパーを別のスレッドでインスタンシエートすると[すなわち各スレッドには独自のオブジェクトインスタンスがあります]同じデータベース上で作業しています。[これは、同じdbインスタンスを持つよりインラインです]。 このような場合は、頻繁にデータベースロックエラーが発生します。これは、スレッドがデータベースの異なるテーブルで作業している場合でも発生します。

私のアプリケーションデータベースでは、アプリケーションを介したユーザー操作またはサーバー[定期同期]を介したデータの取得によって、データベースを更新できます。同期プロセスとユーザーアクティビティが重複しているときに、ロックの問題が発生します。このデータ処理のパターンは、サーバーと同期するアプリケーションでは一般的であるように思われるため、並行性が処理されるためにロックの問題をどのようにして知ることができますか。

私は、これが常に起こるようにバインドされている場合、おそらくデータベースを介して1つのハンドラを作成し、ロックを避けるためにその上にキューを実装する必要があるからです。しかし、それは完全なアプリケーションがデータベースがすぐに更新されないことを知る必要があり、データが実際にデータベースでいつ更新されるかを知るためにリスナーを実装する必要があることを意味します。

おかげ プラディープ

答えて

0

限り、私はsqliteのがsingle process usageのために意図されて知っています。一度に1つのスレッドからデータベースに常にアクセスする必要がある場合でも、複数のクライアントから選択を行うことはできますが、一度に1つずつしか書き込むことはできません。そして、他の読者と作家は、その間にロックするつもりです。

副作用として、データベースへのアクセスはほとんど瞬間的なものとはみなされません。

+0

正しいDBアクセスはほとんど瞬間的ではありませんが、基本的なものは隠されています。ここでは、典型的なプログラミングでは同期コール - 井戸で瞬時に異なりますが、書き込み操作の結果が同期して得られます。そして、結果が成功すれば、対応するデータのために直ちに読むことができます。しかし、私の問題はロックが起こっても(たとえ2つのスレッドが別のテーブルで動作していても)、私はデータベース上でキューイングの動作を実装させているのですが、それは典型的なデータベースプログラミングと大きな違いはありませんJ2SEプロジェクトでさえも。 – user1050134

+1

実際には間違っています。複数のプロセスがSQLiteデータベースにアクセスできます。私は2つのアンドロイドアプリを読み込み、挿入、同じデータベースから削除している。 – JPM

+0

私が提供したリンクをお読みください。それは言う: "同時に複数のプロセスが同じデータベースを開くことができます複数のプロセスが同時にSELECTを行うことができますが、1つのプロセスがいつでもデータベースを変更することができます。 私はこれについてデータベースの著者自身を信頼します。私はあなたがこれらの同時読み取りと書き込みをどのようにテストしているのでしょうか? –

関連する問題