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

Java 使用hibernate同步2个数据库-使用save()、update()或saveOrUpdate()?,java,database,hibernate,session,Java,Database,Hibernate,Session,我正在尝试同步多个项目具有ID GUID的数据库,这意味着一个项目在所有数据库上具有相同的ID 我的问题是: 如果我修改或创建1数据库上的项,并希望将此更改同步到其他数据库,我应该: 1.)检查项目是新的还是刚修改的,如果是新的,则使用save()函数,如果是已修改的,则使用update()函数 或 2.)不要检查它是新的还是修改过的,只使用saveOrUpdate()函数?在注释中看到您的用例后,我认为最好的方法是跟踪(在客户端和服务器上)上次更新/上次同步的时间是什么时候。如果上次同步时间为

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

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

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


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

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

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

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

可以理解,性能和数据同样重要。但是,请坚持使用数据库中的主键,并且您添加的一个额外的select查询应该非常少(小于10ms)。如果您真的想挤出更多的性能,您可以始终使用memcache或redis作为缓存层来确定数据库中是否有特定的GUID。这样,您只需点击内存(而不是数据库)即可确定对象是否存在。这种开销只能通过web服务器和缓存服务器之间的延迟来衡量(因为内存读取非常便宜)

tl;dr


向上插入(或
saveOrUpdate
)是一种方法。尽量不要跟踪一台机器在另一台机器上的状态。

我可以问一下……为什么?如果希望数据库相同,请使用主从复制。如果您只希望在数据库之间共享此特定数据,那么您可能应该重新考虑您的应用程序设计,使此数据只来自一个数据库?我向你保证:当你在两个地方存储相同的数据时,数据就会不同步。我在一台服务器上有一个中央数据库,平板电脑上有一个本地数据库,它们都没有互联网连接,所以如果一个本地数据库添加或更新了一个项目,那么它就会被传输到中央数据库,然后再传输到所有其他数据库。好的,这更有道理。我只需要在客户端上跟踪“上次更新”和“上次同步”的时间。无论何时建立internet连接,都会将上次更新>上次同步的所有对象拉到服务器上。(或者,对于服务器到客户端-同样的事情)哦,所有这些都准备好了,我只是不知道应该使用哪个函数,save(),update(),saveOrUpdate(),我的意思是当使用hibernate会话将项目保存到另一个数据库中时,弹性对您来说听起来比性能更重要。如果上次同步日期早于上次更新日期(或为空),则您知道某些内容已更改。在这一点上,我只会使用
saveOrUpdate
,只是为了澄清一下,saveOrUpdate()的意思是:
Session Session=createSessionMethod();会话.保存或更新(项目)我想你理解错了me@M364M4Ncro事实上,这确实改变了事情,我认为你有自己的方法来做这件事。在这种情况下,Hibernate实际上会错误地尝试更新。您将向上推送一个具有ID(客户端生成的GUID)的对象。在这种情况下,Hibernate将执行更新,即使对象可能还不存在于服务器中。解决办法很简单。您不应该调用saveOrUpdate,而应该自己尝试从数据库中获取对象。如果您得到一个结果,您可以执行
saveOrUpdate
(或者,只执行
update
——没关系)。如果没有,那么
persist
ok,thx,伙计,在hibernate中保存东西真的很复杂,我可以使用session.save(item)吗?如果该项还没有在数据库中,那么就保存(item)?好的,thx为向我解释这一点,这整件事真的让我感到困惑,它可能也会让其他ppl感到困惑,你能更新你的答案让每个人都能看到吗