尝试运行INSERT查询时,如下所示:
javax.persistence.Query query = entityManager.createNativeQuery(MY_NATIVE_QUERY);
return query.executeUpdate();
在Java应用程序中,我得到以下错误:
java.lang.NegativeArraySizeException: null
at oracle.net.ano.CryptoNIONSDataChannel.readDataFromSocketChannel(Unknown Source) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CMAREngineNIO.prepareForReading(T4CMAREngineNIO.java:98) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:534) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:485) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:910) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1119) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.OraclePreparedStatement.executeLargeUpdate(OraclePreparedStatement.java:3865) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3845) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1061) ~[ojdbc8-12.2.0.1.jar:12.2.0.1.0]
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) ~[commons-dbcp-1.4.jar:1.4]
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) ~[commons-dbcp-1.4.jar:1.4]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) ~[hibernate-core-4.3.10.Final.jar:4.3.10.Final]
at org.hibernate.engine.query.spi.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:211) ~[hibernate-core-4.3.10.Final.jar:4.3.10.Final]
at org.hibernate.internal.SessionImpl.executeNativeUpdate(SessionImpl.java:1346) ~[hibernate-core-4.3.10.Final.jar:4.3.10.Final]
at org.hibernate.internal.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:389) ~[hibernate-core-4.3.10.Final.jar:4.3.10.Final]
at org.hibernate.jpa.internal.QueryImpl.internalExecuteUpdate(QueryImpl.java:371) ~[hibernate-entitymanager-4.3.10.Final.jar:4.3.10.Final]
at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:78) ~[hibernate-entitymanager-4.3.10.Final.jar:4.3.10.Final]
使用的数据库是Oracle 10 g,使用的jdbc驱动程序是ojdbc 8 -12.2.0.1。插入查询是一个简单的插入,它从两个表的连接中选择数据并插入另一个表。
此外,我在开发中没有得到这个异常,它只发生在生产中。我遇到了一个解决方案here,它说这是一个内部的Oracle驱动程序错误,并建议升级到最新的10 g驱动程序。但我已经有12 c的司机了。如何解决这个问题?
4条答案
按热度按时间tcbh2hod1#
看起来12.2.0.1有一个错误,有时会导致这个问题。它似乎还取决于环境和查询。我遇到了一个正在获取BLOB的查询,这个问题在许多环境中都会可靠地发生,并且许多其他查询在罕见的设置中确实会失败,但如果它们确实失败了,这可以在那些特定的设置(网络,DB)中可靠地重现。截至目前,12.2.0.1似乎仍然是可用的最新版本。
在www.example.com上,似乎12.1.0.2无法重现此问题。但是,12.1.0.2似乎与Oracle Wallet有问题。因此,如果您遇到NegativeArraySizeException的问题,并且如果您不使用Oracle Wallet,那么使用12.1.0.2而不是12.2.0.1应该对您有用。
使用Oracle 12c DB进行测试。
xpszyzbs2#
oracle.net.ano.CryptoNIONSDataChannel
告诉您启用了某种加密(可能是Oracle Native Encryption)。您可以通过以下查询检查是否使用SSL/TLS加密:
您可以使用以下查询检查您是否有oralce本机加密或校验和:
因此,如果您正在使用加密,请先尝试禁用它,然后再试一次。如果您需要使用它,请尝试从thin切换到oci 8驱动程序,或尝试不同版本(12.1.0.2或11.2.0.4)
vawmfj5a3#
我的解决方案(只是偶然发现了这个令人恼火的事情):
1.在正确的查询之前执行“select 1fromdual”预检查
1.如果失败(得到此异常),请按如下方式重置connectionPool:
班级
不是完美的,但对我来说很好。干杯!
pu82cl6c4#
根据我的测试,使用以下版本(19.7.0.0)修复了此问题。
问题版本是12.2.0.1
Oracle支持页面https://support.oracle.com/knowledge/Middleware/2490793_1.html