我正在参加「掘金·启航计划」
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