SessionFactoryImpl.get错误:java.lang.ArrayIndexOutOfBoundsException: -68问题
最近项目在生产环境抛错:
at org.hibernate.impl.SessionFactoryImpl.get(SessionFactoryImpl.java:339)
at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:411)
at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
at org.hibernate.impl.SessionImpl.iterate(SessionImpl.java:920)
at org.hibernate.impl.QueryImpl.iterate(QueryImpl.java:41)
....
上述是调用Hibernate查询数据query.iterate();后,就抛错了,根据日志分析,错误日志记录的一般是java.lang.ArrayIndexOutOfBoundsException: -68,后面是一个-128范围内的负数,并且根据时间逐渐增大,比如到java.lang.ArrayIndexOutOfBoundsException: -2,然后java.lang.ArrayIndexOutOfBoundsException: -1,然后又轮回到java.lang.ArrayIndexOutOfBoundsException: -127。
开始看了半天一直在找自己代码的问题,最后通过查看hibernate源码SessionFactoryImpl.java的339附近代码,方法如下:
private synchronized Object get(Object key)
{
Object result = this.softQueryCache.get(key);
if (result != null) {
this.strongRefs[(++this.strongRefIndex % 128)] = result;
}
return result;
}
this.strongRefs[(++this.strongRefIndex % 128)] = result;为第339行,strongRefs数组是初始化长度为128的数组,strongRefIndex被定义为:private transient int strongRefIndex = 0;
strongRefIndex是根据每次获取数据都递增1的,根据报错内容,应该是strongRefIndex为负数了,而且每次也确实在递增。
通过上述分析,strongRefIndex字段要不内存中被无故修改了,或者就是递增到int的最大长度2147483647了,导致变为了负数。好像没有其他办法,只能重启网站,重启后问题果然解决了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
2011-12-10 Remoting客户端和服务器段对象不一致的测试