java.lang.NegativeArraySizeException while running INSERT query in ojdbc8

tquggr8v  于 2023-05-12  发布在  Java
关注(0)|答案(4)|浏览(233)

尝试运行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的司机了。如何解决这个问题?

tcbh2hod

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进行测试。

xpszyzbs

xpszyzbs2#

oracle.net.ano.CryptoNIONSDataChannel告诉您启用了某种加密(可能是Oracle Native Encryption)。
您可以通过以下查询检查是否使用SSL/TLS加密:

select sys_context('userenv', 'network_protocol') from dual;

-- SSL/TLS connecion will return "tcps" here

您可以使用以下查询检查您是否有oralce本机加密或校验和:

select network_service_banner from v$session_connect_info
 where sid = sys_context('userenv','sid')
   and network_service_banner like '%crypt%service adapter%';

-- you'll get something like "AES256 encryption service adapter"
-- and/or "SHA1 crypto-checksumming service adapter"

因此,如果您正在使用加密,请先尝试禁用它,然后再试一次。如果您需要使用它,请尝试从thin切换到oci 8驱动程序,或尝试不同版本(12.1.0.2或11.2.0.4)

vawmfj5a

vawmfj5a3#

我的解决方案(只是偶然发现了这个令人恼火的事情):
1.在正确的查询之前执行“select 1fromdual”预检查
1.如果失败(得到此异常),请按如下方式重置connectionPool:

if(connection == null || connection.isClosed())
{
     connection = connectionFactory.getConnection();
}
            
if(!checkConnection(connection))
{
     connectionFactory.reset();
     connection = connectionFactory.getConnection();
}

班级

public class ConnectionFactory implements org.apache.commons.dbcp2.ConnectionFactory
{
...
    PoolingDataSource<PoolableConnection> dataSource = null;
...
    public void reset()
    {
        try
        {
            dataSource.close();
        }
        catch (Exception e)
        {
        }
        dataSource = null;
    }

    public Connection getConnection() throws Exception
    {
        if (dataSource == null)
        {
            this.createConnectionPool();
        }
        
        try
        {
            return dataSource.getConnection();
        }
        catch (SQLException e)
        {
            throw new Exception(e.getMessage());
        }
    }

    private synchronized void createConnectionPool() throws Exception
    {

        ConnectionFactory connectionFactory = this;
        PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, null);
         
        connectionPool = new GenericObjectPool<>(poolableConnectionFactory);
        connectionPool.setMaxTotal(5);
        connectionPool.setMinIdle(1);
        
        poolableConnectionFactory.setPool(connectionPool);
        dataSource = new PoolingDataSource<>(connectionPool);
    }
}

不是完美的,但对我来说很好。干杯!

pu82cl6c

pu82cl6c4#

根据我的测试,使用以下版本(19.7.0.0)修复了此问题。

<dependency>
   <groupId>com.oracle.database.jdbc</groupId>
   <artifactId>ojdbc8</artifactId>
   <version>19.7.0.0</version>
</dependency>

问题版本是12.2.0.1
Oracle支持页面https://support.oracle.com/knowledge/Middleware/2490793_1.html

相关问题