当更新的行数超过2 ^ 31时会发生什么?

时间:2015-11-18 12:29:16

标签: java oracle jdbc spring-jdbc jtds

我有一些代码可能会在表中插入大量行。我目前正在使用Spring的JdbcTemplate.update来执行SQL,但我有一个问题。

该方法与其所委托的JDBC Statement.executeUpdate一样,返回int,其中最大值当然为2 31 = 2147483648。

所以,问题是,JDBC在这种情况下做了什么?返回MAX_INTEGER,其他一些数字,抛出异常?或者行为可能是平台(或驱动程序)特定的?我支持SQL Server(通过jTDS)和Oracle(通过瘦驱动程序)。

2 个答案:

答案 0 :(得分:1)

在JDBC 4.2(Java 8的一部分)中,我们有:Statement类有一个方法executeLargeUpdate,用于执行行数超过Integer.MAX_VALUE的更新。

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

答案 1 :(得分:1)

它依赖于驱动程序,因为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/

中找到