Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一次只取几条记录_Java_Mysql - Fatal编程技术网

Java 一次只取几条记录

Java 一次只取几条记录,java,mysql,Java,Mysql,这个问题可能已经得到了回答,但我找不到一个好的,我正在尝试从一个数据库中读取数据并执行一些操作,我的源数据库非常庞大,像1亿条记录或100GB的表,因此,我尝试了下面的方法一次提取几个记录,这样我就不会出现内存异常,但我得到的只是设置为setMaxRows()的最大记录数,例如,如果设置为100,我只得到100,我正在对mysql数据库进行测试 以下是我的java代码: import java.sql.Connection; import java.sql.DriverManager; impo

这个问题可能已经得到了回答,但我找不到一个好的,我正在尝试从一个数据库中读取数据并执行一些操作,我的源数据库非常庞大,像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
用于控制缓冲的行数。默认值为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);