2012-04-26 147 views
44

我有一个由两个进程使用的SQLite数据库。我想知道,使用最新版本的SQLite,当一个进程(连接)启动一个事务来写入数据库时​​,另一个进程是否可以同时从数据库中读取?我可以从多个连接同时读写SQLite数据库吗?

+0

相关问题请看这里.. http:// stackoverflow。com/questions/12117016/strategies-for-concurrent-read-writing-and-reading-in-sqlite/24038860#24038860 – Nepster 2014-06-04 13:35:50

回答

76

我收集的信息从各种来源,大部分来自sqlite.org,并把它们放在一起:

首先,默认情况下,多个进程可以有相同的SQLite数据库在同一时间打开,几个读访问可以平行满足。

在写入的情况下,对数据库的单次写入会在短时间内锁定数据库,即使是读取,也不会有任何内容访问数据库文件。

从版本3.7.0开始,提供了一个新的“Write Ahead Logging” (WAL)选项,其中读取和写入可以同时进行。

默认情况下,WAL未启用。要打开WAL,请参阅SQLite文档。

+0

journal_mode = WAL解决了我的问题! – 2015-08-21 06:55:36

11

SQLite3的明确允许multiple connections

(5)多个应用程序或同一 应用访问,同时一个单一的数据库文件中的多个实例?

多个进程可以同时打开同一个数据库。 多个进程可以同时做一个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()都将覆盖以前在同一进程中调用的所有 。

相关问题