2つの異なるスレッドからSQLiteデータベースにアクセスしたいので、データベースへの2つの異なる接続を使用しています。両方のスレッドは、主にDBからの読み取りを実行し、時折のみDBに書き込みます。両方のスレッドがDBに同時に書き込みをしていることに対して不安があると感じたら、このシナリオでは何の問題もないはずです。SQLiteの接続とロック
答えて
SQLiteは、最近のバージョンでは、あなたがスレッド間で単一の接続を共有することができ、スレッドセーフとなります。つまり、SQLiteのよくある質問では「スレッドは悪い」と言います(私はSQLiteの文脈では意味しませんが、一般的な記述として)。
SQLiteにはロック機構があり、2番目のインスタンスがデータベースに対して書き込みロックを取得しようとしても、既存のロックが完了するまでキューに入れられます。 FAQは、ファイルシステムでの実装が不適切なため、異なるプロセスからネットワークファイルシステムから複数の接続を使用するのは一般的に安全ではないことを示唆しています。
SQLiteは明示的にスレッドセーフではないため、これを行うとデータが破損する可能性があります。
mutexロックを使用して、両方のスレッドが同時にデータベースにアクセスできないようにするか、まれにしか発生しないファントムデータの破損バグを追跡しようと時間を費やします。
ドキュメントから(http://www.sqlite.org/faq.html# )** ** SQLiteはthreadsafeです** ** –
正しくはありません。ここに私の長い返事を参照してください。
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
- 1. ハイバーネーションの接続ロック
- 2. SQLiteデータベースとの接続
- 3. 角2とSQLiteの接続
- 4. QSqlDatabaseと.sqliteファイルに接続
- 5. Android SQLite _接続
- 6. SQLAlchemy接続、プーリング、SQLite
- 7. SQLiteデータベースに接続
- 8. nodejs SQLiteフェイルオーバーとのMySQL接続
- 9. SQLiteの接続のgetConnection /エラー
- 10. PhonegapのSqliteデータベース接続
- 11. C#でのsqlite接続XamlParseException
- 12. SQLite:リソースファイルへのデータベース接続?
- 13. Sqliteデータベース接続のベストプラクティス
- 14. sqliteデータベースのロック
- 15. node.js sqliteデータベース接続(フロントエンドangular.js)
- 16. NetBeansをSQLiteに接続
- 17. Laravel sqlite DB接続エラー
- 18. PHPiteでSQLiteを接続
- 19. 2つの同時接続/要求ロック
- 20. SQlite JDBCライブラリを使用してJava/Scalaで排他ロックを持つSqlite接続を開きます
- 21. jdbc接続sqlite戻り値の型接続クラス
- 22. SQLiteのデータベース接続の問題のjava/
- 23. SQLiteのデータベース接続の問題のJava
- 24. Ipad wifi接続中断画面ロック
- 25. SqliteのファイナライズとDbロックの問題
- 26. AndroidのSQLite接続チェックのテストケース
- 27. ファイアバードへのsqliteデータベースの接続
- 28. SQLiteは、接続が閉じられた後でもデータベースをロックし続けます。
- 29. 接続文字列SQLiteでの問題
- 30. web.configのSqlite接続文字列
ありがとうございます... FAQは良いリソースでした –
しかし、私は1つの接続では@DrakeAmaraのケースでは、別々の接続があります。これは、データベース – user1530779