Java 默认情况下,resultset中的fetchsize设置为0

Java 默认情况下,resultset中的fetchsize设置为0,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,我必须查询一个数据库,结果集非常大。我正在使用MySQL作为数据库。为了避免在大量搜索后出现“OutOfMemoryError”,我有两个选项:一个是使用LIMIT(特定于数据库),另一个是使用jdbcfetchSize属性 我已经测试了选项1(LIMIT),但它不是理想的解决方案。我不想这样做 使用jdbc我发现ResultSetsize默认设置为0。如何将其更改为其他值。我尝试了以下方法: a) 第一次尝试: rs = preparedStatement.executeQuery(); rs

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

我已经测试了选项1(
LIMIT
),但它不是理想的解决方案。我不想这样做

使用
jdbc
我发现
ResultSet
size默认设置为0。如何将其更改为其他值。我尝试了以下方法:

a) 第一次尝试:

rs = preparedStatement.executeQuery();
rs.setFetchSize(1000);  //Not possible as exception occurs before.
b) 第二,即使没有,我也需要与多个timry数据库通信:

rs.setFetchSize(1000);  //Null pointer exception(rs is null).
rs = preparedStatement.executeQuery();
c) 第三次尝试:

preparedStatement = dbConnection.createStatement(query);
preparedStatement.setFetchSize(1000);
所有这些都不起作用。感谢您的帮助

编辑:

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

SELECT *  FROM a LIMIT 0, 1000
SELECT *  FROM a LIMIT 1000, 2000
作为两个不同的查询


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

除此之外,您还应该像这样更改查询

SELECT * FROM RandomStones LIMIT 1000;

要设置查询的提取大小,请在执行查询之前调用语句对象。如果将fetch size设置为N,则每次访问数据库时都会获取N行


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

见:

默认情况下,结果集被完全检索并存储在内存中。 在大多数情况下,这是最有效的操作方式,并且由于 MySQL网络协议的设计更易于实现。如果 您使用的结果集包含大量行或行 较大的值,并且无法在JVM中为 如果需要内存,您可以告诉驱动程序将结果流式返回 一次一排

要启用此功能,请在中创建语句实例 以下方式:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
前向只读结果集与提取结果集的组合 Integer.MIN_值的大小用作向驱动程序发送流的信号 结果按行设置。在此之后,使用 语句将逐行检索

在一份报告中,他们说有两种方法来处理这种情况


第一个是让语句逐行检索数据,第二个可以支持批量检索。

它正在工作。这就是我写的问题。但是我不想这样,我们不能一行一行地检索吗?@AmandepGautam不在MySQL JDBC驱动程序中,实现就是一切,或者一个接一个。
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);