我正在开发一个使用spring like application容器的java web应用程序。现在,当我使用事务支持弹簧时,我注意到我的注释方法的时间处理加倍。尝试以更好的方式描述该方法:
@Service
public class MyServiceImpl implements MyService{
@Autowired
UtilService utilService;
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void loadContracts(File fileToProcess,UtilDTO dto){
List<MyObject> objects = utilService.readSomethings("xxx","yyy")
//I modify Them
//I save or update them
}
}
@Service
public class UtilServiceImpl implements UtilService{
@PersistenceContext
EntityManager entityManager;
public List<MyObject> readSomethings(String p1,String p2){
String queryString = "from MyObject o where o.param1 = :param1 "
+ " and o.param2 = :param2 ";
Query q = entityManager.createQuery(queryString);
q.setParameter("param1", p1);
q.setParameter("param2", p2);
return q.getResultList();
}
}
例如:
readSomething 方法为时已晚,如果删除注释,其处理时间会有所改善。
为什么会出现这种差异?
答案 0 :(得分:1)
性能可能是由于您每次调用该方法时创建新事务并暂停现有事务。
来自documentation on Propagation.REQUIRES_NEW
,强调我的:
创建新交易,暂停当前交易(如果存在)。类似于同名的EJB事务属性。
除非您有关于为此方法创建新交易的具体要求,否则我建议让它落实到默认行为 - 即Propagation.REQUIRED
。