Java 一次只取几条记录
这个问题可能已经得到了回答,但我找不到一个好的,我正在尝试从一个数据库中读取数据并执行一些操作,我的源数据库非常庞大,像1亿条记录或100GB的表,因此,我尝试了下面的方法一次提取几个记录,这样我就不会出现内存异常,但我得到的只是设置为setMaxRows()的最大记录数,例如,如果设置为100,我只得到100,我正在对mysql数据库进行测试 以下是我的java代码:Java 一次只取几条记录,java,mysql,Java,Mysql,这个问题可能已经得到了回答,但我找不到一个好的,我正在尝试从一个数据库中读取数据并执行一些操作,我的源数据库非常庞大,像1亿条记录或100GB的表,因此,我尝试了下面的方法一次提取几个记录,这样我就不会出现内存异常,但我得到的只是设置为setMaxRows()的最大记录数,例如,如果设置为100,我只得到100,我正在对mysql数据库进行测试 以下是我的java代码: import java.sql.Connection; import java.sql.DriverManager; impo
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
用于控制缓冲的行数。默认值为0,它可以缓冲整个结果,具体取决于驱动程序
请注意,应启用以使setFetchSize
正常工作。见:
另一种选择是使用基于光标的流来检索集合
每次的行数。这可以通过设置连接来完成
属性useCursorFetch为true,然后调用setFetchSize(int)
int是每次要提取的所需行数:
正如您所观察到的那样,只需限制返回的行数,并导致多余的行被丢弃。用于Mysql数据库
stmt = connection.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
用于其他数据库
stmt.setFetchSize(1000);
这不会将整个数据库提取到ResultSet对象中。因此,如果我设置setFetchSize,它将运行查询,但一次只能将100条记录提取到ram中,我的问题是,如果java将整个记录提取到ram中,它将抛出一个错误,称为“线程中的异常”main“java.lang.OutOfMemoryError:java heap space”如果我使用setFetchSize,“线程中的异常”main“java.lang.OutOfMemoryError:java heap space”,我会遇到这个错误。也许还可以启用
useCursorFetch
。我建议尝试像Hibernate或Eclispelink这样的JPA框架,并使用游标功能。这将创建一个resultset流。如果我保持stmt.setFetchSize(Integer.MIN_VALUE);,我一次会得到多少条记录?我不确定它在mysql中一次加载多少条记录,但它不会将整个数据加载到resultset对象中。保留指针并按顺序加载数据。它解决了你的问题吗?是的,它解决了我的问题,记录按顺序进入结果集。
stmt.setFetchSize(1000);