複数の接続から同時にSQLiteデータベースの読み取りと書き込みを行うことはできますか?


89

2つのプロセスで使用されるSQLiteデータベースがあります。SQLiteの最新バージョンでは、一方のプロセス(接続)がデータベースに書き込むためのトランザクションを開始しているときに、もう一方のプロセスがデータベースから同時に読み取ることができるのでしょうか。


関連する質問はこちらをご覧ください..stackoverflow.com
12117016 /

回答:


146

私はさまざまなソース、主にsqlite.orgから情報を収集し、それらをまとめました。

まず、デフォルトでは、複数のプロセスで同じSQLiteデータベースを同時に開くことができ、複数の読み取りアクセスを並行して実行できます。

書き込みの場合、データベースへの1回の書き込みでデータベースが短時間ロックされ、読み取りであっても、データベースファイルにアクセスすることはできません。

バージョン3.7.0以降、新しい「先行書き込みログ」(WAL)オプションが使用可能になり、読み取りと書き込みを同時に続行できます。

デフォルトでは、WALは有効になっていません。WALをオンにするには、SQLiteのドキュメントを参照してください。


したがって、一般の人がデータにアクセスできるようにせずにローカルでデータが必要であるが、複数のファイルを並行して書き込むことができるという問題を解決する必要がある場合、複数の書き込みが同時に発生するように、そのような書き込みごとに1つのデータベースファイルが必要になります。それは...ですか?複数のファイルが通常嫌われることは知っていますが、ローカル計算にのみデータが必要なため、サーバー側のデータベースを使用せずにセロリタスクから複数の書き込みを行う方法を
見つけよ

この機能を防止したい場合は、データベースを単一のプロセスにロックするために使用できるプラグマ、locking_mode = exclusiveがあります。
Scovetta

20

SQLite3は明示的に複数の接続を許可します

(5)複数のアプリケーションまたは同じアプリケーションの複数のインスタンスが単一のデータベースファイルに同時にアクセスできますか?

複数のプロセスで同じデータベースを同時に開くことができます。複数のプロセスが同時にSELECTを実行できます。ただし、データベースに変更を加えることができるプロセスは1つだけです。

接続を共有するには、SQLite3共有キャッシュを使用します。

バージョン3.3.0以降、SQLiteには特別な「共有キャッシュ」モードが含まれています(デフォルトでは無効になっています

バージョン3.5.0では、共有キャッシュモードが変更され、同じキャッシュを単一のスレッド内だけでなくプロセス全体で共有できるようになりました。

5.0共有キャッシュモードの有効化

共有キャッシュモードは、プロセスごとに有効になります。Cインターフェースを使用すると、次のAPIを使用して、共有キャッシュモードをグローバルに有効または無効にできます。

int sqlite3_enable_shared_cache(int);

sqlite3_enable_shared_cache()を呼び出すたびに、sqlite3_open()、sqlite3_open16()、またはsqlite3_open_v2()を使用して作成された後続のデータベース接続に影響します。すでに存在するデータベース接続は影響を受けません。sqlite3_enable_shared_cache()を呼び出すたびに、同じプロセス内の以前のすべての呼び出しが上書きされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.