【问题标题】:Fetching large number of records from MySQL through Java通过Java从MySQL中获取大量记录
【发布时间】:2014-09-11 14:50:03
【问题描述】:

有一个 MySQL 表,服务器上的用户。它有 28 行和 100 万条记录(它也可能增加)。我想从这个表中获取所有行,对它们进行一些操作,然后想将它们添加到 MongoDB。我知道通过简单的“从用户中选择 *”操作来检索这些记录需要很多时间。我一直在 Java、JDBC 中这样做。 所以,我从研究中得到的选择是:

选项 1. 进行批处理:我的计划是从表中获取总行数,即。从用户中选择计数(*)。然后,将获取大小设置为 1000 (setFetchSize(1000))。之后我被卡住了。我不知道我是否可以写这样的东西:

    Connection conn = DriverManager.getConnection(connectionUrl, userName,passWord);
    Statement stmt =conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);
    String query="select * from users";
    ResultSet resultSet=stmt.executeQuery(query); 
  • 我的疑问是,一旦我执行查询,resultSet 是否会有 1000 个条目,我是否应该重复执行该操作直到检索到所有记录。

  • 我放弃了该计划,因为我知道对于 MySQL,ResultSet 会立即完全填充,并且批处理可能不起作用。 This stackoverflow discussionMySQL documentation 帮忙了。

选项 2. 分页:我的想法是我将设置一个 Limit,它将告诉获取的起始索引和获取的偏移量。可能是,将偏移量设置为 1000 并迭代索引。

我阅读了一篇建议的文章link,但没有发现使用 Limit 解决此问题的任何漏洞。

任何足够善良和耐心阅读这篇长文的人,请您分享您对我的思考过程的宝贵意见,如果有错误或遗漏,请纠正我。

【问题讨论】:

    标签: mysql sql batch-processing


    【解决方案1】:

    根据我所做的研究回答我自己的问题:

    1. 批处理对于选择查询并不是很有效,尤其是当您想使用每个查询操作的结果集时。

    2. 分页 - 如果您想提高内存效率,而不是提高执行速度,这很好。当您使用 Limit 触发多个查询时,速度会下降,因为每次 JDBC 都必须连接到 MySQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 2012-07-22
      • 2011-04-13
      相关资源
      最近更新 更多