分享

Hibernate HQL的条件中如果in包含太多的参数会导致堆栈溢出

 catph 2013-05-09
StackOverflowError

抛出的异常如下:

1
2
3
4
5
6
7
  1. java.<span style="">lang</span>.<a href="http://www.google.com/search?hl=en&q=allinurl%3Astackoverflowerror+java.sun.com&btnI=I%27m%20Feeling%20Lucky"><span style="">StackOverflowError</span></a>  
  2.         at rg.<span style="">hibernate</span>.<span style="">hql</span>.<span style="">ast</span>.<span style="">QueryTranslatorImpl</span>$JavaConstantConverter.<span style="">visit</span><span style="">(</span>QueryTranslatorImpl.<span style="">java</span><span style="color: rgb(51, 153, 51);">:</span><span style="color: rgb(204, 102, 204);">573</span><span style="">)</span>  
  3.         at org.<span style="">hibernate</span>.<span style="">hql</span>.<span style="">ast</span>.<span style="">util</span>.<span style="">NodeTraverser</span>.<span style="">visitDepthFirst</span><span style="">(</span>NodeTraverser.<span style="">java</span><span style="color: rgb(51, 153, 51);">:</span><span style="color: rgb(204, 102, 204);">64</span><span style="">)</span>  
  4.         at org.<span style="">hibernate</span>.<span style="">hql</span>.<span style="">ast</span>.<span style="">util</span>.<span style="">NodeTraverser</span>.<span style="">visitDepthFirst</span><span style="">(</span>NodeTraverser.<span style="">java</span><span style="color: rgb(51, 153, 51);">:</span><span style="color: rgb(204, 102, 204);">66</span><span style="">)</span>  
  5.         at org.<span style="">hibernate</span>.<span style="">hql</span>.<span style="">ast</span>.<span style="">util</span>.<span style="">NodeTraverser</span>.<span style="">visitDepthFirst</span><span style="">(</span>NodeTraverser.<span style="">java</span><span style="color: rgb(51, 153, 51);">:</span><span style="color: rgb(204, 102, 204);">66</span><span style="">)</span>  
  6.         at org.<span style="">hibernate</span>.<span style="">hql</span>.<span style="">ast</span>.<span style="">util</span>.<span style="">NodeTraverser</span>.<span style="">visitDepthFirst</span><span style="">(</span>NodeTraverser.<span style="">java</span><span style="color: rgb(51, 153, 51);">:</span><span style="color: rgb(204, 102, 204);">66</span><span style="">)</span>  
  7.         at org.<span style="">hibernate</span>.<span style="">hql</span>.<span style="">ast</span>.<span style="">util</span>.<span style="">NodeTraverser</span>.<span style="">visitDepthFirst</span><span style="">(</span>NodeTraverser.<span style="">java</span><span style="color: rgb(51, 153, 51);">:</span><span style="color: rgb(204, 102, 204);">66</span><span style="">)</span>  

不论是使用 where x in(:x) 还是使用 where x in (1,2,3…)的方式,如果引用的参数超过堆栈空间,都会引发堆栈溢出异常。在大多数的JVM中,参数限制在9000~10000之间。

堆栈溢出的原因在于org.hibernate.hql.ast.util.NodeTraverser在解析语法树的时候采用了递归算法,大量的 in参数会生成一个的子树,子树的深度和in参数的个数相同。解决方法是使用迭代的方式代替递归树,这样就不会耗尽堆栈。在Hibernate 3.2.x以上版本已经解决了这个问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多