als*_*kja 7 database sqlite connection locking
我遇到了一些数据库锁(SQLite_BUSY)问题,我担心SQLite不会对我有用.
基本上,我的设置是一个cronjob,通过一个名为Dropwizard的框架定期调用一些不引人注目的Java功能和(在项目中刚刚开始)一个Jetty/Jackson/Hibernate REST服务.两个"模块"都需要具有数据库访问权限 - 这可能是同一时间......
那么,多个应用程序可以访问SQLite数据库,还是需要切换到MySQL?
小智 12
SQLite可以同时处理读取数据库的多个应用程序,但不能写入它.
来自SQLite FAQ:
多个进程可以同时打开同一个数据库.多个进程可以同时执行SELECT.但是,只有一个进程可以随时对数据库进行更改.
那么,多个应用程序是否可以访问一个 SQLite 数据库,
是的他们可以!
来自答案中链接的同一常见问题user2062950解答:“当任何进程想要写入时,它必须在更新期间锁定整个数据库文件。但这通常只需要几毫秒。其他进程只是等待写入器完成然后继续他们的业务。 ”。
为了避免SQLITE_BUSY错误,您应该指定进程应该等待锁定的时间。您可以使用busy_timeoutpragma执行此操作,在每个进程中使用它,在打开数据库后设置一次。
PRAGMA busy_timeout = 100;
Run Code Online (Sandbox Code Playgroud)
请注意,在WAL 模式下,写入数据库不会阻塞读取器,这很棒,但是写入器仍然需要在它们之间进行同步,并且如果您busy_timeout为它们设置了 ,则会自动执行此操作。
PS 虽然这busy_timeout是实现并发 SQLite 锁的预打包方式,但我的建议是手动实现自旋,以实现更多的控制和可靠性。
在某些情况下,SQLITE_BUSY 数据库等待时间过长。
无论如何,阻塞锁是一个坏主意。依次手动实施旋转锁允许死锁检测、超时、锁定仪表板。
| 归档时间: |
|
| 查看次数: |
6098 次 |
| 最近记录: |