相同的应用程序部署在两个不同的服务器中,但是从数据库中获取相同的数据。如何同步数据库数据

时间:2019-01-06 16:38:59

标签: java spring mule

应用程序的主要工作是从DB获取数据并进行充实。由于性能问题,我们已将代码部署在两个不同的服务器(两个不同的JVM)中。现在的问题是,有时这两个服务器都在获取相同的数据和过程,这会导致重复。现在的问题是如何停止从数据库中获取相同的数据。我们尝试锁定数据库行以及数据库中的所有状态列,服务器之间的延迟以获取数据。但是,当两个服务器同时开始获取数据时,它们中的任何一个有时都不起作用。请帮助解决这个问题

2 个答案:

答案 0 :(得分:1)

您不必锁定行。如果您有固定数量的jvm运行,则可以使用模来获取每个jvm实例中的唯一行。让我们以示例为例,假设您的表中有存储数字序列的列ID。您有两个正在运行的jvm。让我们将0分配给第一个jvm,将1分配给第二个jvm。每次获取行时,将id列的模数设为2(jvm实例的数量)。如果结果与分配给jvm的编号匹配,则进行处理,否则跳过它。

答案 1 :(得分:0)

在这种情况下,有两种处理冲突的标准方法:乐观悲观锁定。

  

乐观当您的应用程序使用长事务或跨越多个数据库事务的对话时,您可以存储   版本控制数据,以便如果同一实体被两个更新   对话中,最后一次提交更改的通知是冲突,   并且不会覆盖其他对话的工作。这种方法   保证一定的隔离性,但扩展性好并且工作特别好   在某些情况下会经常读取。

     

悲观方案中,您只需指定隔离级别   JDBC连接,并让数据库处理锁定问题。

     

悲观锁定的缺点是资源被锁定   从在交易中首次访问它到   交易完成,因此其他交易无法访问   在那段时间内。如果大多数交易只看资源,   永远不要更改它,排他锁可能会导致过大的杀伤力   锁定争用,而乐观锁定可能是更好的方法。

请看一下: Pessimistic and optimistic lockingHibernate -> Locking