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

问题描述:

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

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

该服务正在运行为LOCAL_SERVICE用户和SQLite数据库是在共享系统目录(C:\ProgramData\...和使用预写日志记录(编辑)

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

有没有人处理过这个?除了努力保持两个进程不需要同时使用数据库之外,是否还有解决方案?

+0

服务在另一个用户帐户下运行。你有没有启用WAL? – 2013-03-15 08:50:35

+0

是的,我们正在使用预写式日志记录。 – 2013-03-15 14:23:20

+0

SQLite创建'-shm'文件的directoy的ACL是什么? – 2013-03-15 14:31:27

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