Нулевой указатель при попытке выполнить rewriteBatchedStatements для MySQL и Java

Я пытаюсь делать пакетные вставки в mysql с очень высокой скоростью. Я хотел попробовать параметр конфигурации rewriteBatchedStatements, поскольку я читал, что он может значительно повлиять на производительность. Однако, когда я добавляю опцию, я получаю следующее исключение:

java.lang.NullPointerException
at com.mysql.jdbc.PreparedStatement.computeMaxParameterSetSizeAndBatchSize(PreparedStatement.java:1694)
at com.mysql.jdbc.PreparedStatement.computeBatchSize(PreparedStatement.java:1651)
at com.mysql.jdbc.PreparedStatement.executeBatchedInserts(PreparedStatement.java:1515)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1272)
at com.zaxxer.hikari.proxy.StatementProxy.executeBatch(StatementProxy.java:116)
at com.zaxxer.hikari.proxy.PreparedStatementJavassistProxy.executeBatch(PreparedStatementJavassistProxy.java)

Это мой код, который делает вставки:

try (Connection connection = DBUtil.getInstance().getConnection();
         PreparedStatement preparedStatement = connection.prepareStatement(query)) {
        connection.setAutoCommit(false);
        for (TransactionBatch batch : batches) {
            try {                   
                preparedStatement.setString(1, batch.getDeviceID());
                preparedStatement.setBinaryStream(2, new ByteArrayInputStream(dataArray));
                preparedStatement.addBatch();
            } catch (Exception e) {
               e.printStackTrace();
            }
        }

        preparedStatement.executeBatch();
    } catch (Exception e) {
        e.printStackTrace();
    }

Это мой URL-адрес jdbc:

jdbc:mysql://url:port/tableName?user=userame&password=password&useServerPrepStmts=false&rewriteBatchedStatements=true

Также я использую HikariCP в качестве пула соединений.

РЕДАКТИРОВАТЬ: Обновление - похоже, проблема связана с наличием столбца varbinary (10000) в таблице.


person Nath5    schedule 11.06.2015    source источник
comment
Я не думаю, что вы можете переписать пакеты, содержащие данные BLOB-объектов.   -  person brettw    schedule 11.06.2015


Ответы (1)


Решение состояло в том, чтобы прекратить использование:

preparedStatement.setBinaryStream(inputstream)

вместо этого я использовал

preparedStatement.setBytes(byte[])

Чтобы переписать, ему необходимо вычислить общий размер, что он не может сделать заранее из входного потока. Теперь он отлично работает, и моя скорость записи потрясающая!

person Nath5    schedule 12.06.2015