gpt4 book ai didi

java - JDBC 不会从 SELECT 返回超过 21 亿条记录

转载 作者:行者123 更新时间:2023-11-30 06:41:26 25 4
gpt4 key购买 nike

我通过 JDBC 从 Oracle 表中读取记录。表包含大约 23 亿条记录。 JDBC 只返回我最大。 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-bit 时代machines .所以你会发现基于 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 子句)以处理有意义的行子集。

关于java - JDBC 不会从 SELECT 返回超过 21 亿条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55505195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com