【问题标题】:Streaming MySql ResultSet with fixed number of results at a time一次以固定数量的结果流式传输 MySql ResultSet
【发布时间】:2014-08-31 19:16:14
【问题描述】:

我有 1600 万条记录的 MySql 表,由于一些迁移工作,我正在读取整个 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 时减少到服务器的往返次数

【问题讨论】:

标签: java mysql sql


【解决方案1】:

我假设你使用的是 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);

只进、只读的结果集与 fetch 的组合 Integer.MIN_VALUE 的大小用作驱动程序流式传输的信号 结果集逐行。在此之后,使用 语句将逐行检索。

Integer.MIN_VALUE 之外的任何值都被 MySQL 忽略,标准行为适用。整个结果集将由 JDBC 驱动程序获取。

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

【讨论】:

  • 这意味着在进行流式传输时无法一次加载 1000 行左右,对吗??
  • 当您说“流媒体”时,您必须具体说明您的意思。请显示一些代码。
  • 我问的是我们可以一次流式传输 1000 行而不是逐行流式传输结果集
【解决方案2】:

要一次获取固定数量的记录(例如 1000 批)而不是使用 MySQL JDBC 驱动程序逐个记录流式传输,您需要:

  1. 在您的 JDBC URL 中将 useCursorFetch 设置为 true 并将 defaultFetchSize 设置为所需的批量大小,例如

    jdbc:mysql://localhost/?useCursorFetch=true&defaultFetchSize=1000
    
  2. 根据 MySQL 驱动程序文档,在 JDBC URL 中将 useCursorFetch 设置为 true,然后在创建语句后调用 setFetchSize(1000)。见以下代码:

    conn = DriverManager.getConnection("jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t");
    stmt = conn.createStatement();
    stmt.setFetchSize(1000);
    rs = stmt.executeQuery("SELECT * FROM your_table_here");
    

查看官方文档了解更多信息:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-implementation-notes.html

【讨论】:

    猜你喜欢
    • 2016-06-23
    • 2016-01-13
    • 1970-01-01
    • 2016-09-29
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多