为啥hibernate会插入两条相同的记录(偶尔)

为什么hibernate会插入两条相同的记录(偶尔)

前几天和朋友讨论他遇到的问题:为什么hibernate会插入两条相同的记录(偶尔)?

 

是这么回事:

有两个表: A表 ,B表 一对一的关系,通过Quartz定时任务轮循A表,如果A表有新记录,则插入一条新记录到B表,如果B表已存在记录则更新此记录;

 

为什么新插入到B表的数据偶尔会出现两条呢? 

 

还有个奇怪的事,在本地测试永远不会出现两条相同的,放在测试服务器就偶尔会出现。

 

当时看了仔细看过代码肯定不会有问题,刚开始以为是hibernate持久化引起的,后来在save()方法后调用flush()问题

还是没有解决?

 

由于刚进公司对公司整个架构也不是太了解,后来去请教架构师,找到问题可能出现集群上,因为测试服务器是集群环境,而本地不是,而在集群环境相当于启动了多个定时任务在做相同的事情,因而出现了这种问题,后来将定时任务提取出来,问题不再出现,问题终于解决。

 

其实公司原来的定时任务都是放到一个工程,是单独放出来(不在集群环境内)。

 

 

问题原因归纳

1.没往集群环境去想,考虑问题不够全面

2.公司没有提前对员工有详细的架构讲解

 

希望对出现相同问题的朋友有所帮助。

 

 

有种更好的方法

A表中加入一个IP字段,集群中各定时任务只执行包含自己IP的记录

这样都互不干扰,很好的运用集群环境.

 

 

 

1 楼 zhangzhenting 2011-07-06  
集群环境相当于启动了多个定时任务在做相同的事情,遇到这种情况可以通过下面两种方式解决:
1.给定时任务额外设置一个是否执行的判断标记.
问题:如加全局变量作为判断标记,多个服务启动后,变量标记之间的互斥条件难实现(缓存不同步);

2.取消布署服务中的定时任务.单独编写一个定时任务加入布署步骤中.
2 楼 wenjinglian 2011-07-08  
zhangzhenting 写道
集群环境相当于启动了多个定时任务在做相同的事情,遇到这种情况可以通过下面两种方式解决:
1.给定时任务额外设置一个是否执行的判断标记.
问题:如加全局变量作为判断标记,多个服务启动后,变量标记之间的互斥条件难实现(缓存不同步);

2.取消布署服务中的定时任务.单独编写一个定时任务加入布署步骤中.


A表中加入一个IP字段,集群中各定时任务只执行包含自己IP的记录
这样都互不干扰,很好的运用集群环境.