2012-04-26 5 views
44

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

+0

関連の質問はこちらhttp:// stackoverflow。com/questions/12117016/strategies-for-concurrent-read-writing-and-read-in-sqlite/24038860#24038860 – Nepster

答えて

76

私はほとんどsqlite.orgから、さまざまなソースから情報を収集し、それらを一緒に入れ:

まず、デフォルトでは、複数のプロセスが同時に同じSQLiteのデータベースのオープンを持つことができ、そしていくつかの読み取りアクセスができます並行して満足される。

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

バージョン3.7.0以降は、新しい書類の並び替えと書き込みが可能な新しい“Write Ahead Logging” (WAL)オプションが利用できます。

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

+0

journal_mode = WALは私の問題を解決します! –

11

SQLite3のは、明示的にmultiple connectionsすることができます:

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

複数のプロセスで同じデータベースを同時に開くことができます。 複数のプロセスが同時にSELECTを実行できます。しかし、 のいずれかのプロセスだけが、 の時間内にいつでもデータベースを変更することができます。共有接続の場合

SQLite3 shared cache使用:バージョン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()を呼び出すたびに、同じプロセス内のすべての 以前の呼び出しが上書きされます。

関連する問題