【发布时间】: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 discussion 和 MySQL documentation 帮忙了。
选项 2. 分页:我的想法是我将设置一个 Limit,它将告诉获取的起始索引和获取的偏移量。可能是,将偏移量设置为 1000 并迭代索引。
我阅读了一篇建议的文章link,但没有发现使用 Limit 解决此问题的任何漏洞。
任何足够善良和耐心阅读这篇长文的人,请您分享您对我的思考过程的宝贵意见,如果有错误或遗漏,请纠正我。
【问题讨论】:
标签: mysql sql batch-processing