繁体   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