我通过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 */
}
答案 0 :(得分:4)
Java是在32-bit machines时代发明的。因此,您会在基于32位的Java库中发现许多限制。如您所述,Java中的32位int
或Integer
限于Integer.MAX_VALUE
:2 ^ 31-1或2,147,483,647。
例如,查看JavaDoc中对ResultSet::setFetchSize
的调用。该方法需要一个int
。
虽然我还没有找到具体的文档,但我希望JDBC中的游标的32位限制为大约21亿行。
在实践中,限制为20亿是合理的。正如emeraldjava在“问题”上所评论的那样,一次处理数十亿行是不太现实的。在查询中添加一个过滤器(例如WHERE子句),以处理有意义的行子集。