小。速度很快。可靠。
选择任意三个选项。
SQLite共享缓存模式

1SQLite共享缓存模式

从开始3.3.0版(2006年01月11日),SQLite包含一个特殊的“共享缓存”用于嵌入式服务器的模式(默认情况下禁用)。如果启用共享缓存模式,线程建立多个连接对于同一数据库,连接共享一个数据和模式缓存。这可以显著减少系统。

版本3.5.0(2007-09-04),已修改共享缓存模式,以便缓存可以跨整个进程共享,而不仅仅是在内部共享单个线程。在此变更之前在线程之间传递数据库连接。这些限制是在3.5.0更新中删除。本文档描述了共享缓存模式从版本3.5.0起。

共享缓存模式更改语义在某些情况下,锁定模型。详细信息描述如下本文档。对常规SQLite锁定模型的基本理解(请参见SQLite版本3中的文件锁定和并发详细信息)。

1.1.不鼓励使用共享缓存

共享缓存模式是一种过时的功能。共享缓存模式的使用不鼓励。共享缓存的大多数用例更好地由WAL模式.

共享缓存模式是应开发人员的要求于2006年发明的属于塞班(Symbian)他们的问题是如果手机上的联系人数据库正在同步,则会锁定数据库文件。如果有电话进来,数据库锁会阻止他们通过查询联系人数据库来找到合适的来电铃声或来电者的照片显示在屏幕上,等等。WAL模式(大约2010年)是解决这个问题的更好的方法同时访问而不破坏事务隔离。

从源代码构建自己的SQLite副本的应用程序鼓励使用-DSQLITE_OMIT_SHARED_CACHE公司编译时间选项,因为生成的二进制文件将更小更快。

将继续支持此处描述的共享缓存接口在SQLite中,确保完全向后兼容。然而,使用不鼓励使用共享缓存。

2共享缓存锁定模型

从外部来看,从另一个进程或线程的角度来看或更多数据库连接使用共享缓存显示为单个连接。用于在多个共享缓存或常规数据库用户在其他地方进行了描述。

图1

图1描述了一个示例运行时配置,其中三个数据库连接已建立。连接1正常SQLite数据库连接。连接2和3共享缓存正常锁定协议用于序列化连接1和之间的数据库访问共享缓存。用于序列化的内部协议(或不用于序列化,请参阅下面的“读-未提交隔离模式”)访问共享缓存连接2和3将在本节的其余部分中介绍。

共享缓存锁定模型有三个级别,事务级锁定、表级锁定和模式级锁定。它们在以下三个小节中进行了描述。

2.1.事务级锁定

SQLite连接可以打开两种事务,读和写交易。这不是显式完成的,事务是隐式的读取事务,直到它第一次写入数据库表,此时它变成了一个写事务。

到单个共享缓存的最多一个连接可以打开随时写入事务。这可能与任何数量的读取共存交易。

2.2.表级锁定

当两个或多个连接使用共享缓存时,锁用于在每个表的基础上序列化并发访问尝试。表格支持两种类型的锁,“读锁”和“写锁”。锁被授予连接-在任何时候,每个数据库连接都有一个每个数据库表的读锁、写锁或无锁。

在任何时候,单个表都可以有任意数量的活动读锁或单个活动写锁。要从表中读取数据,连接必须首先获得读锁。要写入表,连接必须获得在那个表上写锁。如果无法获得所需的表锁,查询失败,SQLITE_LOCKED返回给调用者。

一旦连接获得表锁,它就不会被释放,直到当前事务(读或写)结束。

2.2.1.读-写隔离模式

可以使用读_未提交从序列化更改隔离级别的杂注(默认设置),以读取未提交。

读取-未提交模式下的数据库连接不会尝试如前所述,在读取数据库表之前获取读锁以上。如果另一个数据库连接在读取表时修改表,但也意味着以读-未提交模式由连接打开的读事务可以既不阻塞也不被任何其他连接阻塞。

读-未提交模式对写入所需的锁没有影响数据库表(即,读-未提交的连接仍必须获得写锁,因此数据库写入可能仍然被阻止)。此外,读取未提交模式对sqlite架构下面列举的规则所需的锁(请参阅一节“架构(sqlite_Schema)级别锁定”)。

/*设置read-uncommitted标志的值:****True->将连接设置为读取未提交模式。**False->将连接设置为序列化(默认)模式。*/PRAGMA read_uncommitted=<boolean>;/*检索read-uncommitted标志的当前值*/PRAGMA read_uncommitted;

2.3.架构(sqlite_Schema)级别锁定

这个sqlite_schema表支持共享缓存读写以与所有其他数据库表相同的方式锁定(参见说明以上)。以下特殊规则也适用:

三。线程相关问题

在SQLite 3.3.0至3.4.2版中,启用共享缓存模式时,数据库连接只能是由调用的线程使用sqlite3_open()来创建它。并且连接只能与中的另一个连接共享缓存相同的线程。这些限制从SQLite开始就取消了版本3.5.0(2007-09-04)。

4共享缓存和虚拟表

在旧版本的SQLite中,共享缓存模式无法与虚拟表一起使用。SQLite中删除了此限制版本3.6.17(2009-08-10).

5启用共享缓存模式

共享缓存模式按进程启用。使用C接口,可以使用以下API全局启用或禁用共享缓存模式:

int sqlite3_enable_shared_cache(int);

每次呼叫sqlite3_enable_shared_cache()影响后续数据库使用创建的连接sqlite3_open(),sqlite3_open16(),或sqlite3_open_v2()。已存在的数据库连接是不受影响。每次呼叫sqlite3_enable_shared_cache()覆盖同一进程中以前的所有调用。

使用创建的单个数据库连接sqlite3_open_v2()可以使用选择参与或不参与共享缓存模式这个SQLITE_OPEN_SHAREDCACHE公司SQLITE_OPEN_PRIVATECACHE公司标记第三个参数。使用这些标志之一将覆盖全局共享缓存模式设置由建立sqlite3_enable_shared_cache().最多只能使用一个标志;如果同时使用SQLITE_OPEN_SHAREDCACHE和SQLITE_OPEN_PRIVATECACHE标志用于sqlite3_open_v2()那么该行为是未定义的。

什么时候?URI文件名则可以使用“cache”查询参数以指定数据库是否将使用共享缓存。使用“cache=shared”启用共享缓存,“cache=private”禁用共享缓存。使用URI查询参数指定数据库连接的缓存共享行为允许缓存共享被控制在连接声明。例如:

ATTACH'文件:aux.db?cache=共享'AS aux;

6共享缓存和内存数据库

从SQLite开始版本3.7.13(2012-06-11),共享缓存可用于内存中数据库,前提是使用创建数据库URI文件名。为了向后兼容,共享缓存始终内存中已禁用数据库,如果使用未修饰的名称“:memory:”打开数据库。在版本3.7.13之前,共享缓存始终对于内存中的数据库禁用,无论使用的数据库名称是什么,当前系统共享缓存设置或查询参数或标志。

为内存中的数据库启用共享缓存允许两个或多个同一进程中的数据库连接可以访问同一进程内存数据库。共享缓存中的内存中数据库将自动当最后一次连接到该数据库时,删除并回收内存关闭。