gpt4 book ai didi

java - 结果集中的 fetchsize 默认设置为 0

转载 作者:可可西里 更新时间:2023-11-01 07:49:44 24 4
gpt4 key购买 nike

我必须查询一个数据库,结果集非常大。我正在使用 MySQL 作为数据库。为了在大量搜索后避免“OutOfMemoryError”,我有两个选择:一个使用 LIMIT(特定于数据库),另一个使用 jdbc fetchSize 属性。

我已经测试了选项 1(LIMIT),它可以正常工作,但它不是所需的解决方案。我不想这样做。

使用 jdbc 我发现 ResultSet 大小默认设置为 0。我怎样才能将其更改为其他值。我尝试了以下方法:

a) 第一次尝试:

rs = preparedStatement.executeQuery();
rs.setFetchSize(1000); //Not possible as exception occurs before.

b) Second T 即使不存在,我也需要与多个 timry 数据库通信:

rs.setFetchSize(1000);  //Null pointer exception(rs is null).
rs = preparedStatement.executeQuery();

c) 第三次尝试:

preparedStatement = dbConnection.createStatement(query);
preparedStatement.setFetchSize(1000);

这些都不起作用。任何帮助表示赞赏!

编辑:

我不想要使用限制的解决方案,因为:a) 我的结果集中有数百万行。现在做多个查询很慢。我的假设是数据库接受多个查询,例如

SELECT *  FROM a LIMIT 0, 1000
SELECT * FROM a LIMIT 1000, 2000

作为两个不同的查询。

b) 代码看起来很乱,因为你需要有额外的计数器。

最佳答案

MySQL JDBC 驱动程序总是获取所有行,除非获取大小设置为 Integer.MIN_VALUE

参见 MySQL Connector/J JDBC API Implementation Notes :

By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate, and due to the design of the MySQL network protocol is easier to implement. If you are working with ResultSets that have a large number of rows or large values, and cannot allocate heap space in your JVM for the memory required, you can tell the driver to stream the results back one row at a time.

To enable this functionality, create a Statement instance in the following manner:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE serves as a signal to the driver to stream result sets row-by-row. After this, any result sets created with the statement will be retrieved row-by-row.

关于java - 结果集中的 fetchsize 默认设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20496616/

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