java—一次获取几个记录

cpjpxq1n  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(345)

这个问题可能已经回答了,但是我找不到一个好的,我正在尝试从一个数据库中读取数据并执行一些操作,我的源数据库非常庞大,比如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
mftmpeh8

mftmpeh81#

特别适用于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对象中。

hrysbysz

hrysbysz2#

使用 Statement.setFetchSize 控制缓冲的行数。默认值是0,它可以缓冲整个结果,具体取决于驱动程序。
注意,mysql jdbc选项 useCursorFetch 应为启用 setFetchSize 去工作。见实施说明:
另一种方法是使用基于光标的流每次检索一组行。可以通过将连接属性usecursorfetch设置为true,然后调用setfetchsize(int),int是每次要获取的所需行数:

conn = DriverManager.getConnection(
    "jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"
);

stmt = conn.createStatement();
stmt.setFetchSize(100);
rs = stmt.executeQuery("SELECT * FROM your_table_here");
``` `Statement.setMaxRows` 只是限制返回的行数,并导致多余的行被丢弃。

相关问题