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

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

我测试了选项1( LIMIT )它正在工作,但它不是理想的解决方案。 我不想做。

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

a)首先尝试:

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

b)第二个T即使不存在,我也需要与数据库通信多个时间:

 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实现说明 :

默认情况下,ResultSet完全检索并存储在内存中。 在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计更容易实现。 如果您正在使用具有大量行或大值的ResultSet,并且无法在JVM中为所需内存分配堆空间,则可以告诉驱动程序一次将结果流回一行。

要启用此function,请按以下方式创建Statement实例:

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

只有正向的只读结果集与提取大小Integer.MIN_VALUE的组合用作驱动程序逐行传输结果集的信号。 在此之后,将逐行检索使用该语句创建的任何结果集。

除此之外,您应该更改您的查询

 SELECT * FROM RandomStones LIMIT 1000; 

要么

 PreparedStatement stmt = connection.prepareStatement(qry); stmt.setFetchSize(1000); stmt.executeQuery(); 

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