这个问题可能已经回答了,但是我找不到一个好的,我正在尝试从一个数据库中读取数据并执行一些操作,我的源数据库非常庞大,比如1亿条记录或100gb的表,因此,我尝试了下面的方法一次提取几个记录,这样我就不会得到内存异常,但我得到的只是设置为setmaxrows()的最大记录数,例如,如果我设置为100,我只得到100,我正在mysql数据库中对此进行测试。
以下是我的java代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args) throws SQLException {
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "root");
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
stmt.setMaxRows(100);
ResultSet rs = stmt.executeQuery("select * from mydatabase.posthistory");
int i=0;
for (;;) {
System.out.println("Reading the set from: "+i);
while (rs.next()) {
i++;
System.out.println(i);
}
if ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1)) {
System.out.println("End of reading.");
break;
}
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
conn.close();
}
}
}
有人能告诉我我做错了什么吗。任何帮助或建议都会很好。我使用的是mysql jsbc驱动程序版本5.1.22。如果我正常运行它,那么java试图将整个数据带到ram中,这就产生了错误,
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
2条答案
按热度按时间mftmpeh81#
特别适用于mysql数据库
对于其他数据库
这不会将整个数据库提取到resultset对象中。
hrysbysz2#
使用
Statement.setFetchSize
控制缓冲的行数。默认值是0,它可以缓冲整个结果,具体取决于驱动程序。注意,mysql jdbc选项
useCursorFetch
应为启用setFetchSize
去工作。见实施说明:另一种方法是使用基于光标的流每次检索一组行。可以通过将连接属性usecursorfetch设置为true,然后调用setfetchsize(int),int是每次要获取的所需行数: