簡體   English   中英

JDBC從SELECT返回的記錄不超過21億條

[英]JDBC doesn't return more than 2,1 billion records from SELECT

我通過JDBC從Oracle表中讀取記錄。 該表包含約23億條記錄。 JDBC僅向我返回了max。 21億條記錄。 看來JDBC返回的最大計數等於最大整數(2,147,483,647)。 處理以沒有錯誤結束。

我將Oracle 11g(第2版)與ojdbc7結合使用。 我嘗試了一些關於獲取大小的設置(在jdbc或/和Java代碼中)-我從來沒有得到比整數最大大小更多的記錄。

我使用標准的Java代碼從數據庫讀取數據。 輸出文件中所有保存的記錄均正確。

java.sql.Connection conn_tOracleInput_1 = null;
String driverClass_tOracleInput_1 = "oracle.jdbc.OracleDriver";
java.lang.Class.forName(driverClass_tOracleInput_1);

String url_tOracleInput_1 = "jdbc:oracle:thin:@(description=(address=(protocol=tcp)(host="
                + context.COM_SERVER
                + ")(port="
                + context.COM_PORT
                + "))(connect_data=(service_name="
                + context.COM_SERVICE_NAME + ")))";
String dbUser_tOracleInput_1 = context.COM_LOGIN;
String dbPwd_tOracleInput_1 = context.COM_PASSWORD;
java.util.Properties atnParamsPrope_tOracleInput_1 = new java.util.Properties();
atnParamsPrope_tOracleInput_1.put("user", dbUser_tOracleInput_1);
atnParamsPrope_tOracleInput_1.put("password", dbPwd_tOracleInput_1);

conn_tOracleInput_1 = java.sql.DriverManager.getConnection(url_tOracleInput_1, atnParamsPrope_tOracleInput_1);
java.sql.Statement stmtGetTZ_tOracleInput_1 = conn_tOracleInput_1.createStatement();

/* setting time zone */
java.sql.ResultSet rsGetTZ_tOracleInput_1 = stmtGetTZ_tOracleInput_1.executeQuery("select sessiontimezone from dual");
String sessionTimezone_tOracleInput_1 = java.util.TimeZone.getDefault().getID();
while (rsGetTZ_tOracleInput_1.next()) {
   sessionTimezone_tOracleInput_1 = rsGetTZ_tOracleInput_1.getString(1);
}
((oracle.jdbc.OracleConnection) conn_tOracleInput_1).setSessionTimeZone(sessionTimezone_tOracleInput_1);

java.sql.Statement stmt_tOracleInput_1 = conn_tOracleInput_1.createStatement();
String dbquery_tOracleInput_1 = "SELECT ident, end_date, change_date FROM REPO.EMPLOYEE";

java.sql.ResultSet rs_tOracleInput_1 = null;
try {
  rs_tOracleInput_1 = stmt_tOracleInput_1.executeQuery(dbquery_tOracleInput_1);
            rs_tOracleInput_1.setFetchSize(context.FETCH_SIZE);

String tmpContent_tOracleInput_1 = null;
while (rs_tOracleInput_1.next()) {
  ProdCharValStruct prod_char_val = new ProdCharValStruct();

  if (rs_tOracleInput_1.getObject(1) != null)
    prod_char_val.ident = rs_tOracleInput_1.getBigDecimal(1);
 ....
/* write into file */
}

共同的32位限制

Java是在32位 計算機的時代發明的。 因此,您會在基於32位的Java庫中發現許多限制。 如您所述,Java中的32位intInteger限於Integer.MAX_VALUE :2 ^ 31-1或2,147,483,647。

例如,查看您對ResultSet::setFetchSize調用的JavaDoc。 該方法需要一個int

雖然我還沒有找到具體的文檔,但是我希望JDBC中的游標具有大約21億行的32位限制。

實際上,限制為20億是合理的。 正如emeraldjava在“問題”上所評論的那樣,一次處理數十億行是不太現實的。 向查詢添加過濾器(例如WHERE子句),以處理有意義的行子集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM