如何解决休眠事务注释
我对注解有疑问 我的班级:
@Override
@Transactional
public void process() {
. . .
send(persons);
}
public void send(List<person> persons) {
. . .
// person list size 1.000.0000
for(...){
update(persons); --> 1000,1000 sending for loop
}
}
public void update(List<person> persons){
...
List<person> errorPersons;
...
persons.forEach(person-> {
person.setName("Google - " + person.getName());
});
persons.removeAll(errorPersons);
getSession().getTransaction().commit(); //--|
getSession().beginTransaction(); //--| > is works!
getSession().clear(); //--|
send(persons); //recursive
}
它的工作原理如下。我该如何使用注释?
getSession().getTransaction().commit(); //--|
getSession().beginTransaction(); //--| > is works!
getSession().clear();
我尝试了几种方法,但是没有用,您能解决这个问题吗?
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void update(List<person> persons){
getSession().getTransaction().commit(); //--> Not Working
}
@Transactional(propagation = Propagation.REQUIRES)
public void update(List<person> persons){
getSession().getTransaction().commit(); //--> Not Working
}
我只是想做,我该如何做得更好?
解决方法
一种优化此方法的方法可能是使用ScrollableResult获取人员列表并使用类似的内容遍历ScrollableResult
ScrollableResults persons = query.scroll(ScrollMode.FORWARD_ONLY);
while (persons.next()) {
Person person = (Person) persons.get(0);
// do the stuff you want to do with a person
++numberOfFormsHandled;
if (numberOfPersonsHandled % 20 == 0) {
flushAndClearSession();
}
}
if (persons != null) {
persons.close();
}
请告诉我这是否有用。
-Kaj:)
,您正在使用Spring吗?
@Transactional批注围绕您的类/方法生成一个代理来处理事务。仅当使用类的注入代理的客户端调用该方法时,此代理才能拦截。当您从同一类中调用方法update
时,不会通过代理进行操作,因此就没有事务管理。
@Transactional(propagation = Propagation.REQUIRES_NEW)
暂停当前事务(如果有),创建一个新事务,该方法中的所有代码都由该事务管理。一旦该方法以正常方式(无异常)结束,事务将被提交并终止。通话结束后,外部事务再次处于控制之中。
请参见Spring @Transaction method call by the method within the same class,does not work?
通常,在使用@Transactional批注时,您不会调用getSession().getTransaction().commit()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。