从MySQL通过Java获取大量记录

时间:2014-09-11 14:50:04

标签: mysql sql batch-processing

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

选项1.进行批处理:我的计划是从表中获取总行数,即。从用户中选择count(*)。然后,设置一个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.进行分页:我的想法是,我将设置一个限制,它将告诉起始索引以获取和偏移以获取。可以是,将偏移量设置为1000并迭代索引。

我阅读了一篇建议的文章link,但是在使用限制来解决此问题时没有发现任何循环漏洞。

任何有足够耐心和耐心阅读这篇长篇文章的人,请你在我的思考过程中分享你宝贵的意见,如果出现问题或遗失,请纠正我。

1 个答案:

答案 0 :(得分:0)

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

  1. 批处理对于选择查询并不是真正有效,特别是如果您想使用每个查询操作的结果集。

  2. 分页 - 如果您想提高内存效率,而不是提高执行速度,那就很好。每当JDBC必须连接到MySQL时,使用Limit激活多个查询时速度会降低。