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

时间:2017-04-06 20:55:49

标签: java oracle hibernate jdbc

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

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

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)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

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

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

  

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

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