`

HIbernate关键代码位置导致的堆栈溢出问题记录&分析&解决

 
阅读更多

    在我回到公司的第一周周五,远程连接客户服务器,查找我们系统无法正常工作的原因。

    在查看日志时,发现服务器端日志输出信息有很多重复着Hibernate某个类某行代码的异常。

    Hibernate官网文章链接:

    https://forum.hibernate.org/viewtopic.php?p=2385576
    https://hibernate.onjira.com/browse/HHH-2166

    查看以上链接的文章之后,才明白:

    在Hibernate现有的依赖JAR包中,该类的实现方式下:当检索where column in (...)语句类似的操作时,如果In语句中包含的项超过了1W项,则:对应检索方法实现会加大递归次数,最终导致了堆栈溢出!

    在Hibernate官网以上链接中提供了解决方案,优化了这个循环递归的类,当我将新的改进类放入九厂项目主工程下并编译之后,将其覆盖掉hibernate3.jar中对应的.class文件,重新运行项目,发现一切都解决了!

    当时请教了Deng老大,他说:如果以上方式无法解决,我们就在对应的出现错误的方法位置,获取到connection对象,然后纯JDBC方式操作这些in 子项很多的条件检索记录项。(有些疑问:由于这个Hibernate操作类多处[几乎所有地方]都用到了,那么我岂不是要重写所有的方法吗?)
    还好使用hibernate官方提供的改进类之后,系统可以正常运行起来了!


    至于放入hibernate3.jar的方法,首先在主工程中创建一个与之同级的package目录,然后重新编译项目之后,就出现一个该NodeTraverser的Class字节码文件了,此时将hibernate3.jar用解压缩工具打开,然后替换相应位置下的该字节码文件即可!【简略位置如下图】


   





分享到:
评论

相关推荐

    Hibernate总结

    - 防止因循环关联导致的死循环和堆栈溢出异常。 **三、Hibernate的检索策略** 1. **类级别的检索策略** - **立即检索**(默认):`lazy="true"`,加载对象时立即执行SQL。 - **延迟检索**(`lazy="false"`):...

    Hibernate对象持久化状态

    Session 缓存的主要功能包括减少数据库访问次数,保持缓存对象与数据库记录同步,以及防止对象图死循环导致的堆栈溢出异常。缓存会在特定时刻进行清理,如 `commit()`、`find()` 或 `iterate()` 调用后,`flush()` ...

    Java常见错误及解决方案

    - **堆栈溢出错误** **原因分析** - **内存溢出:** JVM为程序分配的栈内存不足,这通常发生在无限循环或递归深度过大时。 - **递归调用或循环调用:** 如果程序中有递归调用或循环引用,可能导致栈溢出。 **解决...

    JDK19-troubleshooting-guide.pdf

    1. JVM 故障:包括 Java 虚拟机的崩溃、内存溢出、堆栈溢出等问题。 2. 应用程序故障:包括 Java 应用程序的崩溃、性能问题、内存泄露等问题。 3. 网络故障:包括网络连接问题、Socket 异常、数据传输错误等问题。 4...

    HIbernate Session 详解

    3. **避免循环引用导致的问题**:当缓存中的持久化对象之间存在循环引用时,`Session` 会通过特殊的算法避免出现访问对象图的死循环,防止由此引发的 JVM 堆栈溢出异常。 #### 四、Session如何清理缓存 `Session` ...

    关于Java开发的五百个常见问题

    6. **JVM内存管理**:垃圾回收、内存泄漏、堆栈溢出等是开发者常见的困惑,理解JVM的工作原理能有效避免这些问题。 7. **反射机制**:Java反射允许运行时动态访问类的信息,如方法、字段和构造器,这在插件开发、元...

    JAVA错误文档[归纳].pdf

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

    C、C++和Java安全编码实践提示与技巧

    文章中提到的“堆栈溢出”即是一种典型的注入攻击方式,它通过向程序传递超出预期的数据量,导致程序栈溢出,从而执行攻击者指定的恶意代码。例如,如果一个函数期望接收固定长度的字符串,但攻击者却发送了更长的...

    顶盖已解决

    1. **Java内存管理**:在Java中,"顶盖"可能指的是内存泄漏或者堆栈溢出等问题。Java使用垃圾收集器自动管理内存,但程序员仍需理解如何有效地使用对象,避免内存浪费。如果一个对象不再被引用,但垃圾收集器未能...

    c++的有关笔试题

    缺点:内联可能导致代码膨胀,宏可能产生副作用和类型安全问题。 5. **回调函数**: 回调函数是一个能在其他函数执行过程中被调用的函数,常用于异步编程,事件处理或传递控制权。 6. **虚函数和抽象函数**: - 虚...

    JavaInselBuch

    递归是一种方法调用自身的技术,适用于解决某些问题,但需谨慎使用以防堆栈溢出。 ### 六、面向对象编程 #### OOP概念 面向对象编程强调将现实世界抽象为类和对象,通过封装、继承和多态实现代码复用和模块化。 #...

    java 面试题汇总

    - 性能调优:GC算法、内存泄漏和内存溢出的识别及解决方法。 6. **框架**: - Spring框架:依赖注入、AOP、Spring Boot、Spring Cloud等。 - MyBatis或Hibernate:持久层操作,SQL映射和实体关系映射。 - MVC...

    Java后端技术面试汇总-2019

    - **内存溢出OOM和堆栈溢出SOE的示例及原因**:超出内存限制时抛出。 - **如何判断对象是否可以回收或存活**:引用计数算法、可达性分析算法。 - **常见的GC回收算法**:标记-清除、复制、标记-整理等。 - **常见...

    JAVA面试题总汇:j2ee面试知识.pdf

    除了这些技术知识点,对于设计模式、性能优化以及测试和调试的理解和实践同样重要,这些知识有助于你在面试官面前展现出自己的系统设计能力和问题解决能力。安全知识的掌握也日益成为开发者需要重视的方面,特别是对...

    【Java面试资料】-(机构内训资料)上海-拼多多-Java高级

    - 垃圾回收:GC算法,垃圾收集器,内存泄漏与内存溢出问题排查。 9. **Spring框架** - Spring核心:依赖注入(DI),AOP(面向切面编程),Bean的生命周期。 - Spring Boot:自动配置,起步依赖,Spring Boot的...

Global site tag (gtag.js) - Google Analytics