我最近发现了SQLite的惊人之处,特别是http://sqlite.phxsoftware.com/上SQLite的.NET Package 器。
现在,假设我正在开发将在同一网络上的多台机器上运行的软件。没有什么疯狂的,可能只有5或6台机器。每个软件示例都将访问存储在共享目录中的文件中的SQLite数据库(这是个坏主意吗?如果有,告诉我!).
如果一个应用程序示例更新了数据库文件,是否有方法通知应用程序的每个示例?一个明显的方法是使用FileSystemWatcher
类,将整个数据库读入一个数据集,然后...你知道...列举整个事件看看有什么新的...但是,是的,**这看起来很愚蠢,实际上。**有这样一个东西作为SQLite更新的提供者吗?
这是一个有意义的问题吗?当涉及到ADO.NET时,我也是一个新手,所以我可能从完全错误的Angular 来处理这个问题。
2条答案
按热度按时间41ik7eoe1#
在网络上使用SQLite并不是一个好主意。看看SQLite自己对这个here的建议。
客户端-服务器数据库将更加可靠,并且还可以解决通知问题。例如,PostgreSQL有一个通过NOTIFY和LISTEN语句的客户端间信令机制,可以直接从客户端或从函数、存储过程或触发器内部使用。
即使您决定使用SQLite,也不要使用文件监视API。由于文件系统内部的竞争条件,它们在Windows上完全被破坏。从FileSystemWatcher的MSDN条目:
请注意,由于与Windows操作系统的依赖关系,当错过事件或超过缓冲区大小时,FileSystemWatcher不会引发Error事件。
它提供了缓解这种情况的建议,但没有一个提供任何可靠性保证。
k75qkfdt2#
虽然没有任何内置机制来挂钩到某种更改事件,但您可以跨多个进程检测SQLite数据库中的更改。
SQLite数据库不应该通过网络共享共享,原因有很多,创建者在这里解释:https://www.sqlite.org/useovernet.html
如果你有一个运行TCP客户端服务器应用程序的服务器,它会接收你的请求并发送数据作为响应,那么效率和一致性要高得多。
轮询文件头
SQLite文件头包含文件更改计数器字段,每当数据库或其表被修改时,该字段就会更新。我们可以在头上使用轮询来检测更改。我不知道为什么这么多人反对轮询,这在低级编程中是完全正常的,如果软件或硬件不提供任何中断,你无论如何都要坚持轮询。
SQLiteHeader结构体
SQLiteHeaderParser类
SQLiteHeaderError枚举
SQLiteChangeMonitor类
高频轮询
SQLiteChangeMonitor
类使用1000ms(1s)的默认轮询间隔。对于高频率的轮询间隔,我建议使用以下答案中描述的模式:https://stackoverflow.com/a/23341005/22191764缺点
这并不提供任何关于修改了什么的信息,但是轮询头文件然后更新数据库视图,然后总是对数据库运行查询并最终更新视图仍然要有效得多。