-1

编辑:如果我可以浏览文件,我会很危险。 http://www.sqlite.org/sharedcache.html

原来的:

sqlite3_open_v2 函数带有签名:

int sqlite3_open_v2(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb,         /* OUT: SQLite db handle */
  int flags,              /* Flags */
  const char *zVfs        /* Name of VFS module to use */
);

第三个参数int flags支持许多选项,其中一些是不言自明的:

#define SQLITE_OPEN_READONLY         0x00000001  /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_READWRITE        0x00000002  /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_CREATE           0x00000004  /* Ok for sqlite3_open_v2() */
/* snip */
#define SQLITE_OPEN_NOMUTEX          0x00008000  /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_FULLMUTEX        0x00010000  /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_SHAREDCACHE      0x00020000  /* Ok for sqlite3_open_v2() */
#define SQLITE_OPEN_PRIVATECACHE     0x00040000  /* Ok for sqlite3_open_v2() */

我的数据库使用(还)没有任何问题,但我想知道 NOMUTEX 与 FULLMUTEX 和 SHAREDCACHE 与 PRIVATECACHE 选项的含义。我发现的 sqlite.org 页面上的描述,例如 SQLITE_OPEN_NOMUTEX,并不是很有帮助。

如果设置了 SQLITE_OPEN_NOMUTEX 标志,那么只要在编译时或启动时没有设置单线程模式,数据库连接就会以多线程模式打开。

如果根据文档已经防止同时读取/写入,互斥标志会做什么?
此外,缓存中有什么,如果我决定共享它,我与谁共享,这对他们的读/写有何影响?
它是否仅在 close() 上刷新?

任何见解都值得赞赏,即使是指向更好描述的链接也会很棒。

4

1 回答 1

1

简而言之,解释起来很麻烦,如果你运行单线程,你不必关心下面的内容:

这是 SQLIte 中最复杂的部分。如果是第 1 版,我什至会称其为“构思不当”,但由于它是具有一些向后兼容性的渐进式进化,我理解开发人员遵循的路径和思维定势。与您阅读官方文档的感觉相反:并非所有组合都有效!!!

此外,虽然模式的决定可以推迟到调用 sqlite3_open_v2(,,,) ,但最好一劳永逸地选择它。好处是您可以决定多个策略,只要每个策略都在不同的数据库文件上。

那说:

SQLITE_OPEN_NOMUTEX 确实编译(或在 sqlite3_open_v2 上激活),使用没有内部互斥锁的 SQLite。仍然可以安全地使用 SQLite 多线程,但根据我的经验,只有在每个线程中打开单独的连接时才能安全地工作。不要尝试使用此模式在 Thread 之间共享连接。

SQLITE_OPEN_FULLMUTEX SQLite 在运行时会创建适当的互斥锁来锁定一些原子操作。我在线程之间共享连接时使用它。(事实上​​我总是使用 FULLMUTEX)如果你想查看在 sqlite3.c 中搜索 sqlite3_mutex_enter(db->mutex); 并且知道当 NOMUTEX db->mutex == NULL 并且没有锁发生时

始终使用 SQLITE_OPEN_FULLMUTEX。互斥量处理现在非常快,对性能没有真正的影响。磁盘/解析在 cpu 中更加繁重,除非您准备好对 sqlite3.c 的代码进行逆向工程,否则不清楚 NOMUTEX 有什么好处

但是,我使用多个连接(每个线程中一个 open_v2)成功地在多线程中试验了 NOMUTEX,但是使用它你还需要担心关于 CACHE 的决定(我使用 SQLITE_OPEN_PRIVATECACHE,并非所有组合都有效,一旦 db 拥有,尤其是缓存,也会改变模式systeme一旦已经打开真的是在找麻烦)在第一次打开之前选择MUTEX+CACHE+sync+journal策略并坚持下去。

另请参阅这篇关于 https://dev.yorhel.nl/doc/sqlaccess的非常好的文章

于 2021-01-06T17:25:12.337 回答