一次使用固定数量的结果流式传输MySql ResultSet

时间:2014-07-10 12:05:03

标签: java mysql sql

我的MySql表有1600万条记录,因为有些迁移工作我正在阅读整个Mysql表。

以下代码用于在MySql中传输大型ResultSet

        statement = connection.createStatement(
                java.sql.ResultSet.TYPE_FORWARD_ONLY,
                java.sql.ResultSet.CONCUR_READ_ONLY);
        statement.setFetchSize(Integer.MIN_VALUE);

但这是一次流式传输一个结果,是否意味着我们每行都在点击MySql服务器

在使用流媒体时我们可以设置类似这样的语句.setFetchSize(1000);

我希望在流式传输大型ResultSet时减少到服务器的往返次数

1 个答案:

答案 0 :(得分:4)

我将假设您正在使用官方MySQL提供的JDBC驱动程序Connector / J.

您明确告诉JDBC(和MySQL)使用statement.setFetchSize(Integer.MIN_VALUE);

逐行传输结果

来自MYSQL Docs

  

默认情况下,ResultSet完全检索并存储在内存中。   在大多数情况下,这是最有效的操作方式,并且由于   MySQL网络协议的设计更容易实现。如果   您正在使用具有大量行数的ResultSet   大值,并且无法在JVM中为堆空间分配堆空间   需要内存,您可以告诉驱动程序返回结果   一次一行。

     

要启用此功能,您需要创建一个Statement实例   以下列方式:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
          java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
     

只进,只读结果集与获取的组合   Integer.MIN_VALUE的大小用作驱动程序要流式传输的信号   结果逐行设置。在此之后,使用。创建任何结果集   语句将逐行检索。

MySQL会忽略除Integer.MIN_VALUE以外的任何取值大小的值,并且标准行为适用。整个结果集将由JDBC驱动程序获取。

要么不使用setFetchSize(),要么JDBC驱动程序将使用默认值(0),或者将值明确设置为0。使用0的值还将确保JDBC不使用MySQL游标,这可能会发生,这取决于您的MySQL和Connector / J版本和配置。