oracle.jdbc.driver.T4CTTIrxd.readBitVector上的java.lang.ArrayIndexOutOfBoundsException(T4CTTIrxd.java:135)

尝试使用延迟加载访问集合并面临下面的问题,我无法弄清楚这个问题的原因是什么。

我在Spring和Driver 12.1.0.2 oracle 11.2.0.4.0上使用Hibernate3。 以下是错误日志。

java.lang.ArrayIndexOutOfBoundsException at oracle.jdbc.driver.T4CTTIrxd.readBitVector(T4CTTIrxd.java:135) at oracle.jdbc.driver.T4C8TTIrxh.unmarshalV10(T4C8TTIrxh.java:123) at oracle.jdbc.driver.T4C8Oall.readRXH(T4C8Oall.java:678) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225) at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1066) at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3716) at oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchMoreRows(InsensitiveScrollableResultSet.java:1015) at oracle.jdbc.driver.InsensitiveScrollableResultSet.absoluteInternal(InsensitiveScrollableResultSet.java:979) at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:579) at com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet.next(WSJdbcResultSet.java:3120) at org.hibernate.loader.Loader.doQuery(Loader.java:697) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.loadCollection(Loader.java:1994) at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36) at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565) at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:63) at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716) at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344) at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86) at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:163) at org.apache.commons.collections.CollectionUtils.select(CollectionUtils.java:515) at com.cmt.acq.service.AcqCampaignService.getGrid(AcqCampaignService.java:1245) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) at java.lang.reflect.Method.invoke(Method.java:611) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:126) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:50) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:50) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at com.sun.proxy.$Proxy157.getGrid(Unknown Source) at com.cmt.acq.action.AcqManageCampaignAction.generateXMLResponse(AcqManageCampaignAction.java:1073) 

这几乎可以肯定是由于行压缩造成的。 数据库识别顺序重复的列值,而不是再次发送值只是概念性地发送“同上”。 所以这个问题高度依赖于返回的数据。 除非查询包含ORDER BY,否则即使在单个数据库上重复执行单个查询也可以以不同的顺序返回行,因此可能难以重现此问题。

在最近的版本中,此代码有几个补丁。 我依稀记得看到这个问题,但我找不到它的错误。 最近代码仍然发生了很大的变化,所以我建议尝试在Oracle Maven上使用的12.2.0.1.0。 如果它与12.2.0.1.0一起复制,请提交一个错误。

使用带有Oracle 10g数据库的12.1.0.2驱动程序时遇到同样的问题。 当驱动程序执行提取时,它显然会发生 – 在滚动ResultSet时查询数据库以获取更多行。

看起来像驱动程序中的一个讨厌的bug。

增加fetchSize属性可以很好地作为一种临时解决方法来避免这个问题,迫使驱动程序一次性检索所有结果而无需提取数据,但这不是一个长期解决方案,可能会对性能产生很大的负面影响/内存取决于查询检索的数据大小和数量。

如果您正在使用Hibernate,请尝试识别引发exception的查询(例如用于hibernate.show_sql ),检查它返回的行数并相应地调整hibernate.jdbc.fetch_size属性。

非零值确定JDBC获取大小(调用Statement.setFetchSize() )。

或者尝试使用不同版本的驱动程序。