SQLite 数据库可以跨 Windows 服务和用户应用程序共享吗?

Posted

技术标签:

【中文标题】SQLite 数据库可以跨 Windows 服务和用户应用程序共享吗?【英文标题】:Can SQLite databases be shared across a Windows service and user application? 【发布时间】:2013-03-14 17:55:24 【问题描述】:

在我的产品中,我想使用 SQLite 在 Windows 服务和用户级应用程序之间共享数据。但是,我遇到了一些问题。

当用户级应用程序创建 SQLite 数据库时,两个程序都可以毫无问题地使用它。但是如果服务创建了 SQLite 数据库,那么 SQLite 似乎处理并发性很差。只要数据库连接处于活动状态,服务进程似乎就会保持写锁定。用户级进程的尝试会导致与共享内存相关的错误(我见过SQLITE_IOERR_SHMOPENSQLITE_IOERR_SHMMAP),而不是正常的SQLITE_LOCKED 错误。当然,当服务关闭与数据库的连接时,用户级进程会再次获得访问权限。

服务以LOCAL_SERVICE 用户身份运行,SQLite 数据库位于共享系统目录 (C:\ProgramData\...) 并使用预写日志记录(编辑)

我的理论是 SQLite 无法在用户级进程和服务之间共享内存,因此不可能同时拥有两个由这些进程保持的连接。

有人处理过这个吗?除了非常努力地避免两个进程同时需要数据库之外,还有其他解决方案吗?

【问题讨论】:

服务在另一个用户帐户下运行。你是否启用了 WAL? 是的,我们正在使用预写日志记录。 SQLite 创建-shm 文件的目录的ACL 是什么? 这有关系吗?两个进程都能够使用该文件,只是不能同时使用。 (似乎一次连接一个数据库。) 我应该补充一点,当进程快速释放它们的数据库连接时,10 秒的繁忙超时似乎可以很好地处理锁定问题。但我希望即使一个进程保持数据库连接超过 10 秒,也不应该有问题。 【参考方案1】:

显然,问题与服务正在创建具有限制性权限的文件夹(在其中创建 SQLite 数据库)有关。一旦我们开始为 Users 组中的任何人创建具有写入权限的文件夹,问题就消失了。

【讨论】:

以上是关于SQLite 数据库可以跨 Windows 服务和用户应用程序共享吗?的主要内容,如果未能解决你的问题,请参考以下文章

跨多个数据库的 SQLite 视图。这个可以吗?有没有更好的办法?

Android 应用程序 - 跨多个设备同步 SQLite 数据库

跨多个 sqlite db 文件连接

SQLite - 跨数据库查询不起作用

[Linux网络编程]sqlite3的介绍和使用+实例

本地 SQLite 与远程 MongoDB