14

SQLite (バージョン 3.7.2) を使用してデータを格納するアプリケーションがあります。同じ SQLite データベースに対して書き込みと読み取りを行う複数のスレッド間で SQLite 接続を共有しています。SQLite は DSQLITE_THREADSAFE=1 でコンパイルされます。これは、SQLite がシリアライズ モードであることを意味します。

SQLite ドキュメントからの引用

シリアル化: シリアル化モードでは、SQLite を複数のスレッドで制限なく安全に使用できます。

それどころか、SQLite Wikiのエントリには次のように書かれています

複数のスレッドで同時に同じデータベース接続を使用しないでください

何百ものスレッドを生成し、正常に動作する読み書き用の SQLite ハンドルを共有するサンプル アプリケーションを試してみました。

では、SQLite wiki エントリは古くなっていますか、それとも SQLite は、同じ接続を使用して同時に異なるスレッドから発生する読み取りと書き込みを処理できないのでしょうか?

4

2 に答える 2

9

編集

DSQLITE_THREADSAFE = 2:マルチスレッドモード「マルチスレッド」という用語は、SQLiteでは少し混乱しています。マルチスレッドモードでは、接続自体がミューテックスを使用して、別のスレッドが接続を使用しているときに1つのスレッドが接続を変更できないようにするため、他のスレッドと接続を共有できないようです。

DSQLITE_THREADSAFE = 1:シリアル化モードただし、シリアル化モードでは、データファイルをロックし、ミューテックスを使用して共有接続へのアクセスを制御します。

ドキュメントから:...SQLiteがSQLITE_THREADSAFE= 1でコンパイルされると、SQLiteライブラリ自体がデータベース接続とプリペアドステートメントへのアクセスをシリアル化するため、アプリケーションは同じデータベース接続または同じプリペアドステートメントを異なるスレッドで自由に使用できます。同時。

したがって、接続を処理する場合、シリアル化モードスレッドセーフですが、マルチスレッドモードはそうではありません。ただし、同じデータベースに複数の接続を設定することはできます。

ソース:http ://www.sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfigmultithread

よろしく!

于 2012-07-31T12:16:13.837 に答える