读书人

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

发布时间: 2012-09-04 14:19:30 作者: rapoo

并发系统中正确使用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的状态          }       }       }

?

读书人网 >编程

热点推荐