Hibernate无状态会话处理错误的最佳方法?

Hibernate无状态会话处理错误的最佳方法?,hibernate,playframework,bulkinsert,stateless-session,Hibernate,Playframework,Bulkinsert,Stateless Session,我正在Play Framework 1.2.4项目中处理批处理作业的无状态会话 我插入和更新行非常好,但我不知道发生异常时该怎么办。这是我的密码: try{ statelesssession.insert(someobject); } catch(ConstraintViolationException e) //It happens from time to time dont ask me why.. { ??????transaction.rollba

我正在Play Framework 1.2.4项目中处理批处理作业的无状态会话

我插入和更新行非常好,但我不知道发生异常时该怎么办。这是我的密码:

try{
      statelesssession.insert(someobject);
   }
catch(ConstraintViolationException e)  //It happens from time to time dont ask me why..
   {
      ??????transaction.rollback();????? THATS MY CONCERN
   }
finally{
      transaction.commit();
   }
我需要知道的是,我每插入100次就提交一次数据。我想知道,如果约束冲突发生在第56条记录中,并且事务执行回滚,我是否也会丢失其他55条记录


如果是,在constraintviolationexception中我必须做什么?还是我应该在每1条记录中都进行承诺以避免这种情况

如果回滚,也将丢失事务中以前的所有记录。如果您只想丢失带有约束异常的记录,那么您可以在列表中保留每个批次的记录,并在批次爆炸时切换到逐个提交,然后继续处理批次。

在这种类型的用例中,您还有另一个作业,它将所有数据切割成100个对象,并为这些对象启动Subbob

在这种情况下,对我来说最好的方法是抛出异常。然后主作业得到这个异常,所有100个对象都被回滚。然后,主作业可以进入这些对象的另一种模式,并重新启动每个对象的子作业。那么只有抛出异常的那个才会被保存

这是典型的批量处理。如果一切正常,批处理会很快,因为您每提交100个对象,但如果出现错误,您会退回到单对象提交,这样您就不会保存失败的对象


但正如mericano1所说,您案例中的正确行为取决于业务规则。

如果您每提交100次插入,那么第56次插入后的回滚也会撤消之前的所有55次插入

您可以在每次插入后提交,但批量插入的行太多,速度太慢,因此不推荐这样做

解决方案使用保存点。

设置保存点相对较快。每次插入后都可以执行此操作。设置保存点不会将任何数据写入数据库(以后仍需提交),但回滚只在最后一个保存点之前完成

因此,在您的示例中,每100行(或其他任何行)提交一次(当然在最后一行之后),并在每一行之后设置一个保存点。当出现错误并回滚操作时,只有错误插入被撤消,其他插入不被触及


有关说明,请参见示例java.sql.Connection.setSavepoint、java.sql.Savepoint或。

我认为您应该向客户询问这个问题,而不是在这里。。但是如果您在第56条记录处回滚而不提交,您将丢失上一次提交之前的更改。Tanks,我不确定它是否只是回滚相应的数据或所有批处理。我还有一个问题,当我遇到异常时,我认为这个对象仍然存在于内存中,因为我的内存使用率越来越高,直到它离开内存。当发生异常时,如何从内存中擦除该数据?因此这里还有另一个问题。当异常发生时,java.exe的内存使用量会增加(我猜java会将对象保留在内存中)。当发生异常时,回收该数据的最佳方法是什么?只要对象上没有引用,gc将自动执行该操作。要检查java内存使用情况,不要使用系统工具跟踪它,而是使用特定工具(如visualvm)跟踪堆使用情况的演变