我有一个由两个进程使用的SQLite数据库.我想知道,使用最新版本的SQLite,当一个进程(连接)启动一个事务来写入数据库时,另一个进程是否能够同时从数据库中读取?
sea*_*717 116
我从各种来源收集信息,主要来自sqlite.org,并将它们放在一起:
首先,默认情况下,多个进程可以同时打开相同的SQLite数据库,并且可以并行满足多个读取访问.
在写入的情况下,对数据库的单次写入会在短时间内锁定数据库,甚至读取都不能访问数据库文件.
从版本3.7.0开始,可以使用新的"Write Ahead Logging"(WAL)选项,其中读取和写入可以同时进行.
默认情况下,WAL未启用.要打开WAL,请参阅SQLite文档.
Aru*_*run 15
SQLite3显式允许多个连接:
(5)同一应用程序的多个应用程序或多个实例可以同时访问单个数据库文件吗?
多个进程可以同时打开同一个数据库.多个进程可以同时执行SELECT.但是,只有一个进程可以随时对数据库进行更改.
要共享连接,请使用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()都会覆盖同一进程中的所有先前调用.
小智 7
我有和你类似的代码架构。我使用了一个 SQLite 数据库,进程 A 从中读取数据,而进程 B 根据事件并发写入数据。(在 python 3.10.2 中使用最新的 sqlite3 版本)。进程 B 不断更新数据库,而进程 A 则从中读取数据以检查数据。我的问题是它在调试模式下工作,但不在“发布”模式下工作。
为了解决我的特定问题,我使用了Write Ahead Logging,这在之前的答案中被引用。在进程 B(写入模式)中创建数据库后,我添加了以下行:
cur.execute('PRAGMA journal_mode=wal')其中 cur 是建立连接时创建的游标对象。
这将日志设置为 wal 模式,允许多次读取(但只有一次写入)的并发访问。在进程 A 中,我正在读取数据,然后连接到我包含的同一数据库:
time.sleep(0.5)
在连接到同一数据库之前设置睡眠计时器解决了我的问题,即它无法在“释放”模式下工作。
就我而言:我不需要手动设置任何检查点、锁或事务。然而,您的用例可能与我的不同,因此很可能需要进行研究。尽管如此,我希望这篇文章对大家有所帮助并节省大家的时间!
| 归档时间: |
|
| 查看次数: |
44220 次 |
| 最近记录: |