多个应用程序可以访问同一个SQLite数据库吗?

12
我遇到了一些数据库锁定(SQLite_BUSY)的问题,我担心 SQLite 对我来说行不通。
基本上,我的设置是一个定期调用一些无聊的 Java 功能和(刚加入项目的)Jetty/Jackson/Hibernate REST 服务的 cronjob,通过一个名为 Dropwizard 的框架。这两个“模块”都需要访问数据库 - 可能是同时进行的...
因此,多个应用程序可以访问 SQLite 数据库吗?还是我需要切换到 MySQL?
2个回答

20

SQLite可以同时处理多个应用程序读取数据库,但不能对其进行写入

来自SQLite FAQ

多个进程可以同时打开同一个数据库。多个进程可以同时执行SELECT语句。但是,在任何时刻只有一个进程可以对数据库进行更改。


谢谢你的回答 :) 你帮了我很多,虽然我会转向使用MySQL。它更适合我的需求。 - alsdkjasdlkja
1
如果它使用相同的数据库但在不同的表上呢? - tiktak
1
@tiktak 那么我上面引用的“只有一个进程可以进行更改”的规则仍然适用 - 每个表的写入都会在发生时锁定整个数据库。SQLite太简单了,无法执行表锁定。 - user2062950
只是为了明确 - 如果有人能帮忙的话。在另一个进程进行写操作期间,是否仍然可以让单独的进程读取?或者在写入时数据库完全被锁定? - ArmadilloChubbz65
@ArmadilloChubbz65 在WAL模式下,向数据库写入不会阻塞读取操作。 - Michael

17
因此,多个应用程序可以访问SQLite数据库。如同在user2062950的答案中链接的同一FAQ所述:“当任何进程想要写入时,它必须在更新期间锁定整个数据库文件。但通常只需要几毫秒。其他进程只需等待写入者完成,然后继续他们的业务。”为了避免SQLITE_BUSY错误,您应该指定进程等待锁定的时间。您可以使用busy_timeout pragma从每个进程设置一次,在打开数据库后进行设置。
PRAGMA busy_timeout = 100;

请注意,在WAL模式中写入数据库不会阻塞读取器,这很棒,但是写入者仍然需要相互同步,如果您为它们设置busy_timeout,它们将自动执行此操作。
附言:虽然busy_timeout是实现并发SQLite锁的预打包方式,但我的建议是手动实现旋转,以实现更多控制和可靠性。
情况时,使用SQLITE_BUSY数据库等待时间过长。
而且,阻塞锁本来就是个坏主意。手动实现旋转锁反而允许检测死锁、超时、锁定仪表板。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接