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用解压缩工具打开,然后替换相应位置下的该字节码文件即可!【简略位置如下图】
???