应用程序的主要工作是从DB获取数据并进行充实。由于性能问题,我们已将代码部署在两个不同的服务器(两个不同的JVM)中。现在的问题是,有时这两个服务器都在获取相同的数据和过程,这会导致重复。现在的问题是如何停止从数据库中获取相同的数据。我们尝试锁定数据库行以及数据库中的所有状态列,服务器之间的延迟以获取数据。但是,当两个服务器同时开始获取数据时,它们中的任何一个有时都不起作用。请帮助解决这个问题
答案 0 :(得分:1)
您不必锁定行。如果您有固定数量的jvm运行,则可以使用模来获取每个jvm实例中的唯一行。让我们以示例为例,假设您的表中有存储数字序列的列ID。您有两个正在运行的jvm。让我们将0分配给第一个jvm,将1分配给第二个jvm。每次获取行时,将id列的模数设为2(jvm实例的数量)。如果结果与分配给jvm的编号匹配,则进行处理,否则跳过它。
答案 1 :(得分:0)
在这种情况下,有两种处理冲突的标准方法:乐观和悲观锁定。
乐观当您的应用程序使用长事务或跨越多个数据库事务的对话时,您可以存储 版本控制数据,以便如果同一实体被两个更新 对话中,最后一次提交更改的通知是冲突, 并且不会覆盖其他对话的工作。这种方法 保证一定的隔离性,但扩展性好并且工作特别好 在某些情况下会经常读取。
在悲观方案中,您只需指定隔离级别 JDBC连接,并让数据库处理锁定问题。
悲观锁定的缺点是资源被锁定 从在交易中首次访问它到 交易完成,因此其他交易无法访问 在那段时间内。如果大多数交易只看资源, 永远不要更改它,排他锁可能会导致过大的杀伤力 锁定争用,而乐观锁定可能是更好的方法。
请看一下: Pessimistic and optimistic locking, Hibernate -> Locking。