数据跑批遇到的session is close

231 阅读1分钟

我正在参加「掘金·启航计划」

1.数据跑批目的

后端定时任务去执行一些数据跑批。
这里主要是方便做一些数据统计的报表。
为了缩短数据抽取的时间和系统资源的占用,这里会用到多线程去处理。
1.1遇到的第一个问题(java.util.concurrentmodificationexception)
报错:java.util.concurrentmodificationexception

原因:是有一些公用数据查询操作,为了提高点效率不重复查询就提前查询出来了。
      然后作为公共参数在线程中传递,业务处理的时候修改这个数据,另外的地方也在处理。
      
解决: 对公共的集合参数做深拷贝,减少错误的发生。      
1.2session is close
报错:在数据处理的时候session is close

业务处理:
new Thread() {
    @Override
    public void run() {
     dao.del();
     dao.save();
    }
}.star();

原因:直接调用dao在当前的新线程中是没有hiberante的session,因为事务在service层自动控制的。
      session应该在service中且有@Transactional会在程序调用的时候自动生成的。
      
解决: 1.手动控制session
      用到的方法
      Session ssessionthis.getSessionFactory().openSession();
      Transaction tx = session.beginTransaction();
      数据处理的时候用session进行处理
      tx.commit();
      tx.rollback();
      session.close();
      
      2.在service中进行处理

通过这里这里可能解决了我的疑惑,因为写的两个定时任务用了上面的两种方式,刚开始的时候感觉都查不多,但是一个就正常跑一个就有问题,后来想了下感觉就是这样的问题。

为什么service会自动对事务进行管理,看下这里 事务自动控制的实现demo