日期:2014-05-16  浏览次数:20660 次

一个Kettle异常的解决方式

最近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报错。