`

Hibernate StackOverFlowError 异常出现的原因

阅读更多

引起StackOverFlowError异常的一般是因为在程序中递归调用是栈溢出造成的,而在Hibernate 的HQL执行包含有 in  

或者 or的语句时

不论是使用 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以上版本已经解决了这个问题。

分享到:
评论

相关推荐

    Java常见异常集-Java,Hibernate,Tomcat异常

    8. **StackOverflowError**:当栈空间耗尽,无法分配新的栈帧时抛出。这可能源于递归调用过深或无限循环。优化算法以减少栈的使用,或者增加JVM的栈大小(-Xss参数)。 9. **SocketException: Unexpected end of ...

    解决hibernate监听器死循环问题

    这种情况通常表现为应用程序试图无限次地执行同一个操作,比如插入记录到数据库中,最终导致`StackOverflowError`异常。本文将详细探讨这一问题,并提供解决方案。 #### 二、监听器基础知识 监听器(Listener)是...

    Java开发常见错误及解决方案文件

    - 错误信息:编译器报错提示无法初始化pagecontext,异常为java.lang.StackOverflowError。 - 原因分析:在接口Rollable中定义的成员变量ball的引用被改变了,但接口中的成员变量默认是public static final的,即...

    JAVA错误文档.pdf

    5. Java异常处理:文档中还出现了“java.lang.IllegalArgumentException”和“java.lang.StackOverflowError”等Java基础异常。IllegalArgumentException通常是因为调用方法时参数不正确,或者尝试创建事件时传入了...

    TongWeb上应用移植常见问题.doc

    2. 针对`StackOverflowError`,检查是否有无限递归的情况,如注解处理器之间的相互引用。如果确认是这个问题,可能需要调整TongWeb的配置或升级相关库。 3. 在某些情况下,可能需要禁用或调整TongWeb的自动扫描机制...

    JAVA错误文档[归纳].pdf

    6. **StackOverflowError** 这是一个运行时错误,表示Java堆栈溢出,通常是由于无限递归或大量方法调用导致。审查代码,找出导致无限循环或深度递归的部分进行优化。 7. **Action的返回方法出错,could not ...

    Java常见错误及解决方案

    解决 `java.lang.StackOverflowError` 错误 **错误信息** - **异常初始化页面上下文** - **堆栈溢出错误** **原因分析** - **内存溢出:** JVM为程序分配的栈内存不足,这通常发生在无限循环或递归深度过大时。 -...

    java面试宝典

    - 错误处理:了解运行时错误,如OutOfMemoryError、StackOverflowError等。 6. **IO与NIO**: - 流的概念:熟悉字节流、字符流、缓冲流,以及文件流、对象流等。 - NIO:理解非阻塞I/O的工作模式,包括通道、...

    java面试精华2

    - **动态扩展**: 大多数情况下,虚拟机栈可以动态扩展以适应更深的调用深度,但如果栈深度超出极限,会抛出`StackOverflowError`异常。 - **栈帧结构**: 每次方法调用都会创建一个新的栈帧,栈帧中包含局部变量表...

Global site tag (gtag.js) - Google Analytics