2015-11-18 86 views
2

我有一些代碼可能會插入大量的行到表中。我目前使用Spring的JdbcTemplate.update來執行SQL,但我有一個問題。當更新的行數超過2^31時會發生什麼?

的方法,像裸JDBC的Statement.executeUpdate其所代表,返回int,其中最大值是當然的2 = 2147483648

所以,問題是,什麼是JDBC在這樣做情況如何?返回MAX_INTEGER,其他數字,拋出異常?或者,行爲可能是平臺(或驅動程序)特定的?我支持SQL Server(通過jTDS)和Oracle(通過瘦驅動程序)。

+2

等待,將您的應用程序_really_在同一個語句插入超過2個十億行?還是純粹的理論問題? – Tunaki

+0

是的,在罕見的情況下,一般來說,它是從一個表格複製(轉換)的行到另一個表格。 – Ray

+1

我不認爲你應該爲此使用Java。如果它將數據從一個表複製到另一個表,則使用您的數據庫工具(如存儲過程)。我甚至無法意識到將這些數據序列化並將數據發送到數據庫需要多長時間,但我認爲這將是巨大的(足夠巨大,因爲應用程序只會在那裏死去)。 – Tunaki

回答

1

這取決於驅動程序,因爲聲明是必須由供應商的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/

相關問題