寻找更好的同步数据库的方法

时间:2013-11-07 17:12:43

标签: database sync

我有一个应用程序(vb.net),它从用户收集数据并将数据本地存储在他们的笔记本电脑上,直到他们与中央SQLServer 2008数据库同步。同步需要在两个方向上。所以现在,我在每条记录上都有一个时间戳,当该记录更新时,它会被设置。然后我比较记录的时间,看看哪个是最近的。如果笔记本电脑上的记录比中央数据库上的记录更新,笔记本电脑记录将被发送。如果中央数据库上的记录比笔记本电脑更新,该记录将被发送到笔记本电脑。

我有大约15张桌子上有数十万条记录。如果您是本地网络,则需要3到4分钟才能完成所有这些操作。远程用户的问题确实变得更糟。它们需要20到30分钟才能同步。通过VPN。

我有大约5个用户这样做,他们都需要通过中央数据库相互保持相同的信息。它们都同步到中央数据库,而不是彼此同步。

除了比较时间戳之外,还有更好的方法来检查每条记录吗?

  • 请注意,每次同步时只会有少数记录(5%)发生变化,但我不知道它们可能是哪些记录。它可以是其中任何一个。所以我必须检查所有这些。

感谢。

1 个答案:

答案 0 :(得分:1)

在我看来,时间戳不是确定将哪些记录发送给另一方的方法。

虽然它们可能对解决冲突“没问题”,但同步方(计算机)上的时间差异可能会导致记录被发送出去,从而导致实际问题。

我自己在一个特定的表上使用一个标识列(在服务器端)生成序列nr,并且在每个事务中,我得到一个新的序列号,并将其分配给其他表的所有更新/插入的行需要同步。

现在,当客户端请求同步时,它会向服务器提供上次同步时收到的最新“序列”,如果是第一次,则为0。

服务器将仅发送序列号较大的记录,然后确定实际发送到客户端的那些记录上的最高序列号,并将该号码提供给客户端以用于下一次同步请求。

在我的场景中,冲突解决是在客户端完成的,因为无论如何所有业务逻辑都是他们的,这意味着客户端总是在开始发送更新之前先收到更新。

因为您为每个事务使用一个新生成的序列号,所以在每次同步期间保持参照完整性,但要确保实际为真, 您需要在开始发送同步数据之前确定当前最高的序列号,并且永远不会检索高于此数字的任何记录,否则您可能会破坏参照完整性。

这是因为,在你已经查询Orders而不是OrderItems之后,其他一些线程可能已经提交了Orders和OrderItems的插入,在没有订单的情况下,你的向外同步包中有OrderItems。

对于删除,我使用IsDeleted列,服务器保留记录一段时间才真正被删除。

当客户端插入数据时,我会向他们反馈记录给定的哪些(主要)密钥等等。

嗯,还有更多内容,我可以在这里提一下,但这里有一些关键的想法,你应该仔细观察:

如何预防:

  • 缺少记录
  • 缺少删除
  • 双重插入
  • 不必要的记录发送(我使用可空字段LastModifierId)
  • 输入验证
  • 参照完整性
  • 解决冲突
  • 性能成本(选择正确的索引,过滤的唯一索引非常适合跟踪临时客户端插入记录的标识,因此它们也可能为空,您需要这些以防止双重插入)

祝你好运,希望这能为思想提供食物......