Что происходит, когда количество обновленных строк превышает 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