JDBC从SELECT返回的记录不超过21亿条

时间:2019-04-03 22:22:46

标签: java ojdbc

我通过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 */
}

1 个答案:

答案 0 :(得分:4)

常见的32位限制

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

例如,查看JavaDoc中对ResultSet::setFetchSize的调用。该方法需要一个int

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

在实践中,限制为20亿是合理的。正如emeraldjava在“问题”上所评论的那样,一次处理数十亿行是不太现实的。在查询中添加一个过滤器(例如WHERE子句),以处理有意义的行子集。