Ama*_*tam 3 java mysql sql jdbc
我必须查询数据库,结果集非常大.我MySQL
用作数据库.为了避免在大量搜索之后出现"OutOfMemoryError",我得到了两个选项:一个使用LIMIT
(特定于数据库),另一个使用jdbc
fetchSize属性.
我测试了选项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)代码看起来很乱,因为你需要有额外的计数器.
除非将提取大小设置为,否则MySQL JDBC驱动程序始终会提取所有行Integer.MIN_VALUE
.
请参阅MySQL Connector/J JDBC API实现说明:
默认情况下,ResultSet完全检索并存储在内存中.在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计更容易实现.如果您使用的是有大量行或大值的结果集工作,并在你的JVM所需的内存不能分配堆空间,你可以告诉司机在时间流的结果返回一行.
要启用此功能,请按以下方式创建Statement实例:
Run Code Online (Sandbox Code Playgroud)stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE);
的仅向前的组合,只读结果集,并且Integer.MIN_VALUE的的读取大小用作信号到驱动器以流结果集一行接一行.在此之后,将逐行检索使用该语句创建的任何结果集.
归档时间: |
|
查看次数: |
9702 次 |
最近记录: |