2011-11-03 14 views
8

2つの異なるスレッドからSQLiteデータベースにアクセスしたいので、データベースへの2つの異なる接続を使用しています。両方のスレッドは、主にDBからの読み取りを実行し、時折のみDBに書き込みます。両方のスレッドがDBに同時に書き込みをしていることに対して不安があると感じたら、このシナリオでは何の問題もないはずです。SQLiteの接続とロック

答えて

6

SQLiteは、最近のバージョンでは、あなたがスレッド間で単一の接続を共有することができ、スレッドセーフとなります。つまり、SQLiteのよくある質問では「スレッドは悪い」と言います(私はSQLiteの文脈では意味しませんが、一般的な記述として)。

SQLiteにはロック機構があり、2番目のインスタンスがデータベースに対して書き込みロックを取得しようとしても、既存のロックが完了するまでキューに入れられます。 FAQは、ファイルシステムでの実装が不適切なため、異なるプロセスからネットワークファイルシステムから複数の接続を使用するのは一般的に安全ではないことを示唆しています。

+0

ありがとうございます... FAQは良いリソースでした –

+0

しかし、私は1つの接続では@DrakeAmaraのケースでは、別々の接続があります。これは、データベース – user1530779

0

SQLiteは明示的にスレッドセーフではないため、これを行うとデータが破損する可能性があります。

mutexロックを使用して、両方のスレッドが同時にデータベースにアクセスできないようにするか、まれにしか発生しないファントムデータの破損バグを追跡しようと時間を費やします。

http://sqlite.org/faq.html#q5

+4

ドキュメントから(http://www.sqlite.org/faq.html# )** ** SQLiteはthreadsafeです** ** –

9

正しくはありません。ここに私の長い返事を参照してください。

What are the best practices for SQLite on Android?

あなたのデータベース破損しませんが、2つの異なるスレッドは、二つの異なる接続で、同時にDBへの書き込みしようとした場合、あなたが問題を持っています。 1つは "失う"でしょう。彼らは順番に実行されるのを待つことはありません。 insertOrThrowの代わりに 'insert'を呼び出すと、例外は発生しません。 DBに書き込むことはありません。

ここで、AndroidのSqliteがどのように動作するのですか。各SqliteOpenHelperインスタンスには、データベースへの接続が1つあります。 'getRead/WriteableDatabase'を何度呼び出しても問題ありません。 1つのヘルパー、1つの接続。また、Androidのsqlite接続コードは独自のスレッドロックを実装しているため、同じSqliteOpenHelperを使用し、拡張機能を使用する場合は同じ接続を使用しても問題ありません。

しかし、複数のヘルパーを使用すると、悪いことになります。

私はあなたが複数のスレッドの読み込みと1つの書き込みを持つことができ、OKになると思われますが、これはテストしていません。

書き込みパフォーマンスに複数のスレッドを使用していますか?もしそうなら、私は単純にあなたの "トランザクション"の使用を最適化することをお勧めします。複数の独立した書き込みを行う場合、その速度は非常に遅くなります。バッチでそれらをすべてラップすると、非常に高速です(比較的)。私はこれが独立した書き込みごとに、Androidにディスクをフラッシュする(非常に遅い)からだと思う。あなたが束でそれらを行う場合、変更はすべて1書き込みで行われます。1つのヘルパーのインスタンスを維持するためとして

は、ここではそれについての私の最近のブログ記事です:

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

私はOrmLite Androidのポートの私の初期の実装の一部として、いくつかのかなり複雑な参照カウントロジックを書いていました、しかし、私はこれがすべて現時点で必要だとは思わない。リンクでの完全性のために

http://touchlabblog.tumblr.com/post/24474455802/ormlite-for-android

、sqliteのロックと複数の接続についての私のブログの記事:

http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking

+0

これらのリンクは現在死んでいます、あなたは現在のものを投稿することができます、私は本当にこれらを読むことに興味があります。ありがとう! – Matthias

+1

あなたは正しいです。私がそれらを持っているかどうかを掘ると参照する必要があります。それらが存在する場合、彼らはhttp://touchlabblog.tumblr.comの下になるでしょう –

+0

それらを見つけました、ありがとう! – Matthias

関連する問題