有几点需要考虑:
- 为什么中央数据库不总是可用?
- 报告是针对中央数据库还是本地数据库执行?
- 是否需要 2 路同步(本地 <-> 中央)?
- 同步期间连接的可靠性如何?
我最近继承的一个解决方案通过以下方式处理这个问题:
- Windows 服务在后台运行——它负责同步。本地应用程序不是。
- 对于中央 --> 本地同步,每条记录都有一个 last_updated (DateTime) 列。每次更新记录时,它都会更新为 CURRENT_TIMESTAMP。对于本地数据库中的每个表,Windows 服务都会检查最新的记录时间戳。向中央数据库中的相应表发起查询以获取任何新的/更新的记录,例如
SELECT * FROM central.table WHERE last_update > @lastLocalUpdate;
. 任何结果都会在本地数据库中插入/更新。
- 对于本地 --> 中央同步,本地数据库中的每条记录只有一个 is_sent (boolean) 列。每次对记录进行本地更新时,此设置为 false。对于本地数据库中的每个表,Windows 服务都会检查尚未发送到中央数据库的记录,即
SELECT * FROM local.table WHERE is_sent = 0;
. 任何结果都被插入/更新到中央数据库中,然后 is_sent 设置为 1。
这有点健谈,但它最终奏效了。在我的情况下,本地设备经常失去连接,所以这种粒度是有效的。
我的愿望清单上最重要的是彻底改革这个机制并实现一个消息队列。
编辑:如果您坚持不想对现有代码库进行任何更改,则可以在 SQL 级别实现 last_updated / is_sent 更新并进行同步。服务作为一个完全独立的项目。“隐形更新”不会成为最干净的解决方案,但是嘿 - 选择你的战斗。