2014-09-19 59 views
-1

我们的Java程序必须从DB2表中删除大量记录,但它的事务日志不足。使用Java SQL部分数据删除休眠

我们正在努力增加日志空间,但由于内部流程和其他事情......需要一周的时间才能完成。

我们正在寻找临时的方式来一次删除一些记录,而不是全部删除。例如,当我们有1000条记录要删除时,我们希望程序一次删除50条记录,然后执行提交并继续执行下一个50条记录,直到删除所有1000条记录。如果在删除X个记录后删除失败,它仍然没有问题。

我们使用Hibernate。

请求您就如何实现的建议。我正在检查sql中的sqlstate和sqlcode,即使在成功的sql执行情况下,但我的不好,我找不到方法。

这么喜欢,循环做......而(检查完成SQLCODE不是真的)

的缺失应该从Java Web应用程序的用户请求而除了发生,我们不能从后台删除,我们也有一些表约束和删除级联。

+0

为什么不是一次大的批量删除而不是所有的单次删除? – 2014-09-19 14:25:22

+0

@ M.Deinum,如上所述,我们正在用单个批量删除耗尽事务日志空间。 – 2014-09-19 14:26:56

+0

从你的帖子来看,这不是那么明显,但唉。如果你知道你想删除的ID,那么只需将它们以可管理的块拆分即可。您还声明您正在使用hibernate,具体取决于您使用JQL删除记录或检索它们并删除它们或使用SQL将它们删除? – 2014-09-19 14:30:41

回答

0

我不知道,但休眠你可以改变你删除对:

delete from (
    select * from schema.table where id=:id fetch first 50 rows only 
) 

假设的executeUpdate()返回的行数删掉,你可以把它放进一个循环(伪):

... stmt = session.createSQLquery("delete from (... fetch first 50 rows only)"); 
int n = 1 
while (n > 0) { 
    transaction = session.beginTransaction(); 
    n = stmt.executeUpdate(); 
    transaction.commit();  
} 
+0

不确定语义,所以你可能需要在循环中移动stmt = ...。 – Lennart 2014-09-19 17:23:16

+0

非常感谢您的回复,非常感谢。 是的executeUpdate将返回更新或删除的行数。 – 2014-09-19 18:37:10