JDBC不会从SELECT返回超过2,1亿条记录

问题描述 投票:2回答:1

我通过JDBC读取Oracle表中的记录。表包含大约2,3亿条记录。 JDBC只返回了我的最大值。 21亿条记录。似乎JDBC返回的max count等于max integer(2,147,483,647)。处理结束,没有错误。

我将Oracle 11g(第2版)与ojdbc7结合使用。我尝试了一些设置大小(在jdbc或/和java代码中) - 我从来没有得到比整数最大大小更多的rec。

我使用标准的java代码从db读取。输出文件中保存的所有记录都是正确的。

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 */
}
java ojdbc
1个回答
4
投票

32-bit limits common

Java是在32-bit machines时代发明的。因此,您将在基于32位的Java库中找到许多限制。正如你所提到的,Java中的32位intInteger仅限于Integer.MAX_VALUE:2 ^ 31-1,或2,147,483,647。

例如,查看JavaDoc以获取对ResultSet::setFetchSize的调用。这种方法需要一个int

虽然我还没有找到具体的文档,但我希望JDBC中的游标具有大约21亿行的32位限制。

在实践中,限制20亿是合理的。正如emeraldjava对该问题的评论,一次处理数十亿行并不可行。在查询中添加一个过滤器,例如WHERE子句,以处理有意义的行子集。

© www.soinside.com 2019 - 2024. All rights reserved.