最近kettle中的几个转换抛出如下异常:
Because of an error, this step can't continue:
org.pentaho.di.core.exception.KettleException:
Error inserting row into table [BOND_ISSUE] with values: [291209410397], [8067], [8067], [中国普天信息产业股份有限公司2009年度第一期短期融资券], [6], [1], [1420], [2], [2009/03/24 00:00:00.000], [中国普天信息产业股份有限公司], [99], [null], [null], [联合资信评估有限公司、中诚信国际信用评级有限公司], [A-1], [中国光大银行股份有限公司], [2], [2009/03/24 00:00:00.000], [全国银行间债券市场机构投资者(国家法律、法规禁止购买者除外)。], [\利率招标\簿记建档\], [100], [1000000], [null], [2009/03/30 00:00:00.000], [2009/03/31 00:00:00.000], [800000000], [800000000], [null], [2009/04/01 00:00:00.000], [89], [null], [null], [2010/03/26 00:00:00.000], [2011/05/30 10:02:49.000], [360064768821], [null], [null], [null], [null], [null]
Unexpected error inserting row
-32363
at org.pentaho.di.trans.steps.tableoutput.TableOutput.writeToTable(TableOutput.java:445)
at org.pentaho.di.trans.steps.tableoutput.TableOutput.processRow(TableOutput.java:128)
at org.pentaho.di.trans.step.RunThread.run(RunThread.java:50)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.pentaho.di.core.exception.KettleDatabaseException:
Unexpected error inserting row
-32263
at org.pentaho.di.trans.steps.tableoutput.TableOutput.writeToTable(TableOutput.java:341)
... 3 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: -32263
at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2677)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9270)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:210)
at org.pentaho.di.trans.steps.tableoutput.TableOutput.writeToTable(TableOutput.java:315)
... 3 more
报错的是一个 表输出 组件
解决方式: 表输出组件默认为使用批量插入,数量为1000条。将1000条修改为500条,转换就可以正常执行了。
分析:看样子是 ojdbc的bug。当前用的是ojdbc6。已经是最新的ojdbc了。报问题的时机都是在已经batch到库中1000条,进行第二个1000条插入的时候就报错了
所以认为跟batch的记录条数有关系。降低条数后果然不再报错。因为异常中有 java.lang.ArrayIndexOutOfBoundsException: -32263 。我猜测ojdbc用一维数组保存了
batch条数 x 记录列数 。当batch很大时,超出了整数能表示的数组下标最大值时,ojdbc报错。