getGeneratedKeys возвращает пустой ResultSet после executeBatch - PullRequest
0 голосов
/ 19 мая 2018

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

public ResultSet insert_into_batch(ArrayList<Movie> values) throws SQLException
{
    conn.setAutoCommit(false);
    ArrayList<String> added = new ArrayList<String>();
    String stmt = "INSERT INTO movies (id,title,year,director) VALUES (?,?,?,?)";
    PreparedStatement psInsertRecord = conn.prepareStatement(stmt, Statement.RETURN_GENERATED_KEYS);
    for (Movie movie : values)
    {
        if (!added.contains(movie.getId())) {
            added.add(movie.getId());
            psInsertRecord.setString(1, movie.getId());
            psInsertRecord.setString(2, movie.getTitle());
            psInsertRecord.setInt(3, movie.getYear());
            psInsertRecord.setString(4, movie.getDirector());
            psInsertRecord.addBatch();
        }
    }
    psInsertRecord.executeBatch();
    conn.commit();
    conn.setAutoCommit(true);
    return psInsertRecord.getGeneratedKeys();
}

1 Ответ

0 голосов
/ 19 мая 2018

Я вижу три потенциальных проблемы с вашим кодом.

  1. Вы вставляете запись с явным идентификатором, поэтому ключи не могли быть сгенерированы.Сгенерированные ключи предназначены для случаев, когда система баз данных генерирует идентификатор, но ваш код генерирует его явно (некоторые системы баз данных все равно будут генерировать набор результатов, но не все, не уверены насчет MySQL в этом случае).

  2. Вы фиксируете соединение непосредственно после пакетного выполнения, в результате созданный при выполнении набор результатов сгенерированных ключей (если он есть) уже будет закрыт или соответствующая информация очищена.Хотя я и ожидал, что драйвер вызовет исключение при вызове getGeneratedKeys() в этой ситуации.

  3. В спецификации JDBC указано, что определяется реализацией, поддерживается ли getGeneratedKeys для пакетавыполнение, поэтому возможно, что оно вообще не поддерживается (но быстрый взгляд на источники MySQL Connector / J показывает, что это поддерживается).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...