Oracle executeBatch异常:ArrayIndexOutOfBoundsException

原文地址:http://yanwushu.sinaapp.com/oracle_executebatch_arrayindexoutofboundsexception/

使用jdbc接口PreparedStatement.executeBatch()向oracle中批量执行sql时候,出现异常ArrayIndexOutOfBoundsException,具体信息如下:

java.lang.ArrayIndexOutOfBoundsException: -32413
    at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2672)
    atoracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10688)
    atcom.keyi.xxx.dal.xx.importFile(PublicCustomerImportDao.java:107)

看样子是oralcejdbc驱动内部setupBindBuffers方法中出现了数组越界异常,但是是什么原因导致的此异常出现,一直没有搞清楚。在网上找到一个帖子,通过他的思路得到了解决方案。

帖子内容如下:

The 10g driver apparently keeps a global serialnumber for all parameters in the entire batch, with a "short"variable. So you can have at most 32768 parameters in the batch. I was havingthe same exception because I have a
INSERT statement with 42 parameters and mybatches can be as big as 1000 records, so 42000 > 32768 and this overflowsto a negative index. I reduced the batch factor to 100 to be safe, and all iswell. I guess your update DML should have a larger number of parameters
perrecord, right? (My diagnostic of the bug is just deduction from the symptoms)

帖子地址为:https://community.oracle.com/thread/599441?start=15&tstart=0

大体的意思是,oracle的preparedStatement批量执行sql时,对参数个数是有上限的(针对不同版本的oracle驱动,这个上限对不同的可能是不同的),这个参数个数的含义指addBatch的次数*每条sql中的参数个数。对于Oracle
10g的驱动来说,这个值可能是32768,所以编程时,addBatch的次数*每条sql中的参数个数应该小于这个值,否则报错。

按照这个思路,将addBatch的数量减少,使每次executeBatch的参数值小于32768,发现异常解决。

时间: 2024-10-05 12:08:23

Oracle executeBatch异常:ArrayIndexOutOfBoundsException的相关文章

oracle存储过程异常捕获

oracle存储过程异常捕获学习,执行及演示过程: 存储过程: CREATE OR REPLACE PROCEDURE sp_test_2 ( param1 in int, --输入参数 param2 in int, out_return out varchar2 --返回结果 ) is --全局变量 val int; errorException exception; --申明异常 errorCode number; --异常代号 errorMsg varchar2(1000); --异常信息

VCS引起的oracle数据库异常重启一例

1. 环境描述 操作系统版本:SUSE Linux Enterprise Server 10 sp2 (x86_64) 数据库版本:Oracle 11.1.0.7.16 VCS版本:5.1 blog地址:http://blog.csdn.net/hw_libo/article/details/41171561 2. 问题现象及分析 凌晨3:46左右,手机短信收到数据库异常告警. (1)查看数据库alert日志 Sun Nov 16 03:46:51 2014 Stopping backgroun

C# 连接Oracle数据库异常总结

这2天因为工作需要连接Oracle数据库,中间发生了很多问题 一.使用OleDbConnection连接数据库 ------------------ Provider=OraOLEDB.Oracle.1;User ID=sajet;Password=tech;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.225)(PORT = 1521))) (CONNECT_DAT

Oracle之异常信息的加工处理

引言     很多时候,我们调用oracle存储过程都会发生各种各样的异常信息,例如ORA-12899值过大,ORA-01400不能插入空值等.虽然说这类异常是前端没控制到位的缘故,但是现实很难100%完全控制住,所以一旦发生了这类异常,并返回的前端显示时就会造成很差的用户体验了.或许,我们可以将这类异常加工一下,包装得好看些,让用户看得懂发生了什么事情,能够自行处理.下面是我的一点尝试.     我们通常会在oracle存储过程的异常处理得到异常信息,如: Exception When Oth

双网卡环境导致Oracle连接异常

现在就是流行向最高水平看齐,这次项目的部署,好好的SQL Server扔了(有正版授权的企业版,神啊...),逢人就夸:"俺们那上的可是最顶级的Oracle Database System!".看了看价钱,也确实蛮顶级的,60万,吓得直接就没敢含到项目整体预算里. 可是贵的东西就好用么?未必.这个建筑在Java上,满身UNIX气息的东西,一副死板的面孔.装的时候就被叮嘱要注意,装不好LISTENER就可能起不来...还好哥们我还练过,Windows版的也没有Linux的那么陌生,折腾了

JDBC连接oracle executeBatch方法执行成功返回值-2

executeBatch方法是提交批处理的命令,返回一个整形数组int[],数组中的每个数字对应一条命令的影响行数,在Oracle的驱动中没有实现该功能,即提交成功后不能返回影响行数,所以返回-2. 在JDBC的规范中Statement.SUCCESS_NO_INFO(-2)代表:执行成功,受影响行数不确定 参考原文:https://blog.csdn.net/w171203757/article/details/47252377 原文地址:https://www.cnblogs.com/hzy

Oracle获取异常的具体出处dbms_utility.format_error_backtrace

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE :返回当前异常相应的描述,通过它就能知道异常的最初生成处.   系统为最近一次生成的异常设置了一个栈,并跟踪它的传递过程,而这个函数使用这个栈,然后返回该异常的整个传递过程.这个函数对错误的定位和实施下一步处理起着至关重要的作用. DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 系统为最近一次生成的异常设置了一个栈,并跟踪它的传递过程,而这个函数使用这个栈,然后返回该异常的整个传递过程.这个函数对错误

bdump目录对应的x权限丢失导致的oracle 数据库异常

rhel6.3 x64bit ,oracle 11.2.0.4 x64bit [[email protected] test]$ pwd /u01/app/oracle/diag/rdbms/test/test [[email protected] test]$ chmod u-x trace [[email protected] test]$ ll total 100 drwxr-x---. 2 oracle oinstall 4096 Feb 20 2013 alert drwxr-x---

c++自定义数组越异常 ArrayIndexOutOfBoundsException (学习)

#include <iostream> using namespace std; const int DefaultSize = 10; class Array{public: Array(int itsSize=DefaultSize); ~Array() { delete[] pType; } //运算符重载 int& operator[](int offset); const int& operator[](int offset) const; int GetItsSiz