Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java SQL Hibernate删除部分数据_Java_Sql_Spring_Hibernate_Db2 - Fatal编程技术网

使用Java SQL Hibernate删除部分数据

使用Java SQL Hibernate删除部分数据,java,sql,spring,hibernate,db2,Java,Sql,Spring,Hibernate,Db2,我们的Java程序必须从DB2表中删除大量记录,但事务日志已经用完了 我们正在努力增加日志空间,但由于内部流程和其他原因。。。完成这项工作需要一周以上的时间 我们正在寻找一种临时方法,一次删除几个记录,而不是全部删除。例如,当我们有1000条记录要删除时,我们希望程序一次删除50条记录,然后执行提交并继续下一个50条记录,直到删除所有1000条记录。如果删除X条记录后删除失败,仍然可以 我们正在使用Hibernate 请您就如何实现这一目标提出建议。即使在成功的sql执行场景中,我也在考虑检查j

我们的Java程序必须从DB2表中删除大量记录,但事务日志已经用完了

我们正在努力增加日志空间,但由于内部流程和其他原因。。。完成这项工作需要一周以上的时间

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

我们正在使用Hibernate

请您就如何实现这一目标提出建议。即使在成功的sql执行场景中,我也在考虑检查java中的sqlstate和sqlcode,但我的缺点是,我找不到方法

所以,就像,我做。。。while(检查sqlcode是否完成非true)


我们无法从后端删除,因为删除应该在java web应用程序的用户请求时进行,此外,我们还有一些表约束和删除级联。

我不知道Hibernate,但您可以将删除更改为:

delete from (
     select * from schema.table where id=:id fetch first 50 rows only
)
假设executeUpdate()返回已删除的行数,则可以将其放入循环(伪代码):


为什么不是一个大的单次批量删除而不是所有的单次删除?@M.Deinum,如前所述,单次批量删除的事务日志空间已经用完了。从你的帖子中看,这并不是那么明显,但很遗憾。如果您知道要删除的ID,只需将它们分割成可管理的块。您还声明您正在使用hibernate,具体取决于您所做的工作。您是使用JQL删除记录,还是检索并删除记录,还是使用SQL将记录删除?@M.Deinum,感谢您的关注和回答我的问题。这就是我们现在正在做的:`transaction=session.beginTransaction();createSQLquery(“从schema.table中删除,其中id=:id”).setParameter(“id”,userinput).executeUpdate;transaction.commit();`如果我的问题在帖子中不清楚,请道歉。不确定语义,因此您可能必须移动stmt=。。。内部循环。非常感谢您的回复,非常感谢。Yes 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();    
}