首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

并发系统中准确使用hibernate的evict和clear

2012-09-04 
并发系统中正确使用hibernate的evict和clear前段时间在系统中发现一个问题,几经周折,终于找到问题的原因。?

并发系统中正确使用hibernate的evict和clear

前段时间在系统中发现一个问题,几经周折,终于找到问题的原因。

?

问题通过简单的代码描述如下(代码比较简单,未进行unlock操作,只是描述hibernate缓存的相关问题):

?

public void dealOrder(String orderCode){       Order order = orderService.getOrderByCode(orderCode);       if(!lockService.lock(orderCode)){              order = orderService.getOrderByCode(orderCode);              if(order!=null && order.getStatus()!=Order.FINISH){                     OrderService orderService = (OrderService)ApplicationContextUtil.getBean("orderService");                                   orderService.dealOrderOnly(order);//REQUEST_NEW,这个操作会改变order的状态          }       }       }

??

这个代码在并发访问的时候会出现问题,在第二次获得对象前,必须evict或clear Order对象,否则,dealOrderOnly方法还是会执行两次。正确的代码如下:

public void dealOrder(String orderCode){       Order order = orderService.getOrderByCode(orderCode);       if(!lockService.lock(orderCode)){              orderService.evict(order);//清空hibernate缓存              order = orderService.getOrderByCode(orderCode);              if(order!=null && order.getStatus()!=Order.FINISH){                     OrderService orderService = (OrderService)ApplicationContextUtil.getBean("orderService");                                   orderService.dealOrderOnly(order);//REQUEST_NEW,这个操作会改变order的状态          }       }       }

?

热点排行