加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java – Spring JPA deleteInBatch导致StackOverflow

发布时间:2020-12-15 01:42:40 所属栏目:大数据 来源:网络整理
导读:我有一个问题是使用deleteInBatch从db中删除项目. 我有一个对象A有一个对象B列表,如: class A {private List 该列表包含7k多个元素. 所以现在我必须删除A及其所有元素.我试过通过deleteInBatch,但我得到了 org.springframework.web.util.NestedServletExcep

我有一个问题是使用deleteInBatch从db中删除项目.
我有一个对象A有一个对象B列表,如:

class A {
private List 

该列表包含7k多个元素.
所以现在我必须删除A及其所有元素.我试过通过deleteInBatch,但我得到了

org.springframework.web.util.NestedServletException: Handler processing failed;
nested exception is java.lang.StackOverflowError

使用sipmle delete方法删除项目有效,但需要5分钟以上.
我的删除代码是:

public void delete(Long id) {
A a = repository.findOne(id);
deleteElements(a);
repository.delete(a);
}

private void deleteElements(A a) {
repository.deleteInBatch(a.getListOfB);
}

有没有一个很好的解决方案来加快删除过程或如何更改,以便deleteinbatch不占用所有休眠堆栈 – 不增加它?

完整的Stacktrace:

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.StackOverflowError
org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1259)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:163)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:206)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:179)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)

等等…

root cause

java.lang.StackOverflowError
org.hibernate.hql.internal.ast.tree.SqlNode.

等等….

最佳答案
在您的情况下,删除查询将由JpaRepository转换为如下所示.

delete from [table_name] where [criteria] = id or [criteria] = id (and so on...)

jvm抛出堆栈溢出错误,因为HqlSqlBaseWalker正在尝试搜索所有或(或基本上where标准)语句

我想,在你的情况下,你可以尝试生成自己的删除查询,然后执行它,或者你可以尝试将数据拆分成几个列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读