1

我有一个 C# Winforms 应用程序。应用程序的一部分提取 SQLite 表的内容并将其显示到数据网格视图的屏幕上。我似乎有多个用户/计算机正在使用该应用程序的问题。

当程序加载时,它会打开一个与 SQLite DB 引擎的连接,该连接会保持打开状态,直到用户退出程序。在加载时,它会刷新有问题的表并继续定期这样做。当一位用户正在使用该表或该一位用户打开了多个程序实例时,该表会正确更新。但是,如果不止一个人使用它,则该表似乎不会反映其他用户所做的更改,直到程序关闭并重新打开。

一个示例 - 第一个用户(用户 A)登录。该表有 5 个条目。他们加了一个。现在有6个条目。用户 B 现在登录并看到 6 个条目。用户 A 输入另一条记录,总共 7 条。即使在自动刷新之后,用户 B 也看到 6 条。并且在他们关闭并重新打开程序之前不会看到 7。用户 A 看到 7 没有任何问题。

知道什么可能导致这个问题吗?它必须与 SQLite 的数据库引擎相关,因为我 100% 确定我的自动刷新工作正常。我怀疑它与预写日志功能或连接池(我已启用)有关。我禁用了两者以查看会发生什么,并且发生了同样的问题。

4

2 回答 2

0

这可能是文件锁定问题 - 第一个应用程序可能正在获取独占写入锁定,从而阻止了其他应用程序实例。如果这是真的,那么 SQLite 可能只是在更新数据文件之前等待锁定被释放,这不是一个理想的行为,但是再次将 SQLite 用于多用户应用程序也不理想。

发现可以(或应该在最新版本中)使用共享锁的提示。这可能是一个简单的解决方案,但是这方面的文档并不容易找到(可能是因为这太过分了 SQLite 的规范?)

尽管如此,最好自己序列化文件访问。这取决于您的精确系统架构,以及您应该如何最好地处理此类功能。

从您的描述中不清楚您的系统架构。您谈到访问 SQLite 文件的“多个用户/计算机”。

如果使用 SQLfile 的网络共享来实现多台计算机的要求,那么这确实会成为一个日益严重的问题。建议使用更好的架构或其他 RDBMS。

如果多台计算机通过服务器进程(或同一台机器上的多个服务器进程?)访问数据,那么简单的监视器锁(lock 关键字)或 ReaderWriterLock 将有所帮助(在多个服务器进程的情况下,操作系统互斥锁将是必需的)。

更新

鉴于您最初的问题,上述内容仍然适用。但是,鉴于您的情况,查看您的根本问题 - 无法访问您的企业 RDBMS,我还有一些其他建议:

  1. 您的 PC 上的 Maria DB / mySQL / postgreSQL - 当然这需要您的 PC 保持开启。
  2. 托管在数据中心中的某种数据库和/或服务层(这里有很多选项,例如 VPS、Azure DB、共享托管 DB 等。当然,所有这些都会产生成本 [也许有一些小的免费的) ])
于 2013-03-16T03:40:05.070 回答
0

跨网络文件系统的 SQLite 不是一个很好的解决方案。您会发现 FAQ 和适当的使用页面轻轻地引导您远离使用 SQLite 作为跨 NFS 的并发访问数据库。

虽然理论上它可以工作,但网络文件系统的实现和延迟大大增加了在写入操作期间发生锁定冲突的机会。

我应该指出,读取数据库会创建一个只读锁,这对于并发访问来说很好。

于 2013-03-20T22:32:08.280 回答