Что происходит, когда количество обновленных строк превышает 2^31?

У меня есть код, который потенциально может вставить огромное количество строк в таблицу. Я сейчас использую Spring's JdbcTemplate.update выполнить SQL, но у меня есть беспокойство.

Метод, как голые JDBC Statement.executeUpdate которому он делегирует, возвращает intгде максимальное значение конечно 231 = 2147483648.

Итак, вопрос в том, что делает JDBC в такой ситуации? Вернуть MAX_INTEGER, другой номер, сгенерировать исключение? Или, возможно, поведение зависит от платформы (или драйвера)? Я поддерживаю как SQL Server (через jTDS), так и Oracle (через тонкий драйвер).

2 ответа

Это зависит от драйвера, потому что Statement - это интерфейс, который должен быть реализован драйвером jdbc поставщика.

Например, это то, что происходит внутри драйвера MySQL jdbc

public int executeUpdate(String sql) throws SQLException {
    return Util.truncateAndConvertToInt(executeLargeUpdate(sql));
}

что значит

public static int truncateAndConvertToInt(long longValue) {
    return longValue > Integer.MAX_VALUE ? Integer.MAX_VALUE : longValue < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int) longValue;
}

Таким образом, в этом конкретном случае, для этого конкретного драйвера, он вернет Integer.MAX_VALUE, и никакое исключение не будет выдано.

Драйвер и исходный код MySQL jdbc доступны здесь http://dev.mysql.com/downloads/connector/j/

В JDBC 4.2 (которая является частью Java 8) мы имеем: Statement у класса есть метод executeLargeUpdate для выполнения обновления, число строк которого превышает Integer.MAX_VALUE,

https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html

Другие вопросы по тегам