我有一个C#Winforms应用程序。部分应用程序提取SQLite表的内容并将其显示在datagridview的屏幕上。我似乎遇到了多个用户/计算机正在使用该应用程序的问题。
当程序加载时,它会打开与SQLite数据库引擎的单个连接,该引擎在用户退出程序之前保持打开状态。在加载时,它会刷新有问题的表并继续定期执行此操作。当一个用户正在使用它时,或者如果该用户打开了多个程序实例,该表会正确更新。但是,如果不止一个人使用它,该表似乎不会反映其他用户在程序关闭和重新打开之前所做的更改。
示例 - 第一个用户(用户A)登录。该表有5个条目。他们加一个。现在有6个条目。用户B现在登录并看到6个条目。用户A输入另一条记录,共7条。用户B即使在自动刷新后仍然看到6条记录。并且在关闭并重新打开程序之前不会看到7。用户A看到7没有任何问题。
知道可能导致此问题的原因是什么?它必须与SQLite的数据库引擎相关,因为我100%确定我的自动刷新工作正常。我怀疑它与预写日志记录功能或连接池(我已启用)有关。我禁用了两者以查看会发生什么,并且会出现同样的问题。
答案 0 :(得分:0)
这可能是文件锁定问题 - 第一个应用程序可能正在进行独占写锁定,阻塞其他应用程序实例。如果这是真的,那么SQLite可能只是等到锁定被释放后才更新数据文件,这不是理想的行为,但是再次使用SQLite进行多用户应用程序也不理想。
我有found提示可以使用SHARED锁(或者应该在最新版本中)。这可能是一个简单的解决方案,但是这个文档并不容易找到(可能是因为这会使SQLite的规范过于弯曲?)
尽管如此,最好自己序列化文件访问。这取决于您的精确系统架构,以及您应该如何最好地处理这样的功能。
您的系统架构不清楚您的描述。您说的是访问SQLite文件的“多个用户/计算机”。
如果使用SQLfile的网络共享实现多台计算机要求,那么这确实是一个日益严重的问题。建议使用更好的架构或其他RDBMS。
如果多台计算机通过服务器进程(或同一台机器上的多个服务器进程?)访问数据,那么一个简单的Monitor锁(lock关键字)或ReaderWriterLock将有所帮助(在多个服务器进程的情况下,一个OS)将需要互斥。)
<强>更新强>
鉴于你原来的问题,上述情况仍然适用。但是根据您的情况,查看您的根本问题 - 无法访问您的业务RDBMS,我还有其他一些建议:
答案 1 :(得分:0)
跨网络文件系统的SQLite不是一个很好的解决方案。您会发现FAQ和Appropriate Uses页面可以让您轻松地避免使用SQLite作为NFS上同时访问的数据库。
虽然理论上可以工作,但网络文件系统的实现和延迟会大大增加在写入操作期间发生锁定冲突的可能性。
我应该指出,读取数据库会创建一个只读锁,这对于并发访问来说很好。