使用hibernate同步2个数据库 - 使用save(),update()或saveOrUpdate()?

时间:2013-07-10 13:34:06

标签: java database hibernate session

我正在尝试同步其项目具有GUID的多个数据库,这意味着一个项目在所有数据库上具有相同的ID。

我的问题是: 如果我修改或创建1个数据库上的项目,并希望将此更改同步到其他数据库i:

1。)检查项目是新项目还是仅修改项目,如果是新项目则使用save()函数,如果已修改,则使用update()函数

2.)不检查是新的还是修改过的,只是使用saveOrUpdate()函数?

1 个答案:

答案 0 :(得分:1)

在评论中看到您的用例后,我认为最好的方法是在上次更新/上次同步的时间跟踪(在客户端和服务器上)。如果上次同步时间为空,或者在上次更新时间之前,您知道需要同步数据。

现在,问题的核心:如何同步它。客户端在向您发送对象时无需知道服务器的状态。事实上,它不应该。考虑客户端发布对象,服务器接收并处理它的情况,但连接在客户端收到响应之前就已消失。这是一个非常有效的方案,会导致数据不匹配。因此,您尝试确定服务器是否已收到对象(来自客户端)的任何方式都可能最终处于错误状态。

最好的解决方案是在服务器上创建一个幂等端点(一个upsert方法,或者你在问题中引用的saveOrUpdate),它能够确定如何处理对象。服务器可以通过主键查询它的数据库,以确定它是否具有该对象。如果是,它可以更新,如果没有,它可以插入。

可以理解,性能和数据都很重要。但是,坚持使用数据库中的主键,并添加一个额外的选择查询应该非常小(低于10毫秒)。如果你真的想要提高性能,你总是可以使用memcache或redis作为缓存层来确定你的数据库中是否有某个GUID。这样,您只需要访问内存(而不是数据库)来确定对象是否存在。其开销只能在Web服务器和缓存服务器之间的延迟时间内进行测量(因为内存读取非常便宜)。

<强> TL;博士

Upsert(或saveOrUpdate)是要走的路。尽量不要跟踪另一台机器的状态。