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

Ama*_*tam 3 java mysql sql jdbc

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

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

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

a)首先尝试:

rs = preparedStatement.executeQuery();
rs.setFetchSize(1000);  //Not possible as exception occurs before.
Run Code Online (Sandbox Code Playgroud)

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

rs.setFetchSize(1000);  //Null pointer exception(rs is null).
rs = preparedStatement.executeQuery();
Run Code Online (Sandbox Code Playgroud)

c)第三次尝试:

preparedStatement = dbConnection.createStatement(query);
preparedStatement.setFetchSize(1000);
Run Code Online (Sandbox Code Playgroud)

这些都不起作用.任何帮助赞赏!

编辑:

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

SELECT *  FROM a LIMIT 0, 1000
SELECT *  FROM a LIMIT 1000, 2000
Run Code Online (Sandbox Code Playgroud)

作为两个不同的查询.

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

Mar*_*eel 8

除非将提取大小设置为,否则MySQL JDBC驱动程序始终会提取所有行Integer.MIN_VALUE.

请参阅MySQL Connector/J JDBC API实现说明:

默认情况下,ResultSet完全检索并存储在内存中.在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计更容易实现.如果您使用的是有大量行或大值的结果集工作,并在你的JVM所需的内存不能分配堆空​​间,你可以告诉司机在时间流的结果返回一行.

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

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
Run Code Online (Sandbox Code Playgroud)

的仅向前的组合,只读结果集,并且Integer.MIN_VALUE的的读取大小用作信号到驱动器以流结果集一行接一行.在此之后,将逐行检索使用该语句创建的任何结果集.