UnableToExecuteStatementException:批量输入已中止。调用getNextException以查看原因

时间:2016-08-25 16:25:14

标签: java sql

使用@SqlBatch批量更新数据库

@SqlBatch("<SQL Command>")
@BatchChunkSize(INSERT_BATCH_SIZE)
void insert(@BindBean Iterator<SomeObj> someObj);

我收到了这个错误:

  

org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException:   java.sql.BatchUpdateException:批处理条目0 ...已中止。呼叫   getNextException查看原因。

问题是被捕获的例外是UnableToExecuteStatementException而不是原来的BatchUpdateException,因此我无法致电getNextException查看原因。此外,我可以直接在DB中运行SQL命令。

任何想法如何找到问题的根源或问题可能是什么?

2 个答案:

答案 0 :(得分:1)

我刚看到Hibernate和Postgres之类的东西。据我了解,问题出在PostgreSQL驱动程序(org.postgresql.core.v3.QueryExecutorImpl)中。

我看到的是:

java.sql.BatchUpdateException: Batch entry 0 INSERT INTO myscheme.table_name (list,of,column,names,...) VALUES (9007199314139196, 'F', 27, 625, 625, 625, 625, 625, 28), (9007199314139198, 'T', 2395, 2369, 2369, 2369, 2369, 2369, 2389), ... was aborted.  Call getNextException to see the cause.

不提供信息。

我抓住并打印了例外,

    } catch(JDBCConnectionException t) {
        System.out.println("================ {{{");
        SQLException current = t.getSQLException();
        do {
           current.printStackTrace();
        } while ((current = current.getNextException()) != null);
        System.out.println("================ }}}");
        throw t;
    }

得到了:

Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 33300

仍然令人困惑。 33300是一个非常奇怪的数字。重要的是它是列数的倍数。

发生异常

at org.postgresql.core.v3.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1329)

pgStream.SendInteger2(params.getParameterCount()); // # of parameter types specified

这是什么意思?

对于单个INSERT语句,值的总数,即列数乘以行数不得超过32767.

您可以将32767除以列数,以获得每个SQL INSERT语句的最大行数。

答案 1 :(得分:0)

我发现了使用DataPipeline CopyActivity从Aurora(MySQL)导入Redshift的类似问题。 我可以通过将输入数据转换为insertQuery中正确的目标表类型来解决此问题:

INSERT INTO my_table (id, bigint_col, timestamp_col) VALUES (?,cast(? as bigint),cast(? as timestamp))