【问题标题】:How to use multi threading to fetch data in mysql如何使用多线程在mysql中获取数据
【发布时间】:2017-04-09 21:11:24
【问题描述】:

您好,我正在尝试从 MYSQL DB 中的一个表中获取 50K + 行。检索所有数据并将其写入文本文件需要 20 多分钟。我可以使用多线程来减少此获取时间并使代码更高效吗?任何帮助将不胜感激。

我已经使用正常的 JDBC 连接和 ResultSetMetaData 从表中获取行。

String row = "";
    stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select * from employee_details");
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
while (rs.next()) {
        for (int i = 1; i < columnCount; i++) {
            row = row + rs.getObject(i) + "|";// check
        }
        row = row + "\r\n";
    }

我正在将获取的值写入文本文件,如下所示。

BufferedWriter writer = new BufferedWriter(new FileWriter(
    "C:/Users/430398/Desktop/file/abcd.txt"));
    writer.write(row);
    writer.close();

【问题讨论】:

  • 我认为多线程根本不会加快速度。想想瓶颈在哪里和是什么——穿线会影响这个吗?
  • 但是尝试一下看看会发生什么并没有什么坏处——你在实验中发现了什么?
  • 我尝试使用简单的 JDBC 连接和结果元数据来获取值。需要 20 分钟。我不确定多线程是否可以在这里工作
  • 再说一次,我不这么认为,因为瓶颈我相信是从磁盘获取数据,我看不出线程将如何加速起来,但让我们看看专家们怎么说。
  • 请查阅SELECT INTO OUTFILE

标签: java mysql multithreading


【解决方案1】:

请记住,rs.next 将分批从数据库中获取结果。其中 n 是由 JDBC-Implementation 定义的数字。我猜现在是10点。因此,对于每 10 个批次,它会再次查询数据库,因此会有网络开销 - 即使它在同一台机器上。

只是增加这个数字会导致加载时间更快。

编辑: 添加这个 stmt.setFetchSize(50000); 可能是这样。

请注意,这会导致大量内存消耗。

【讨论】:

  • 我已经尝试添加 stmt.setFetchSize(50000);但仍然需要 19 分钟才能获取数据。
  • @BasheerAhmed:但这比 20 多分钟要好。
  • @HovercraftFullOfEels 很抱歉造成混乱。 20+ 分钟大约是 21 分 45 秒。
  • 您可能还需要玩一会儿。您也可以将其设置为另一个数字。开始时尝试 1000。
  • 用一个查询获取更多行肯定会加快速度。
【解决方案2】:

首先您需要确定瓶颈在哪里。是 SQL 查询吗?还是通过 ResultSet 获取行?还是建造巨大的弦乐?或者也许写文件?

您需要测量算法的上述各个部分的持续时间并告诉我们结果。没有这些知识是不可能告诉如何加速算法的。

【讨论】:

  • 使用 ResultSet 获取数据比将数据写入文件要花费更多时间。我正在考虑在 SQL 中使用批处理(使用 OFFSET)来减少获取时间。
  • 您是否尝试过在不构建巨大字符串的情况下进行提取?
  • 问题在于构建巨大的字符串。我用过StringBuilder,2秒内获取数据。
  • 然后我建议您接受我的回答 - 我认为我的回答在给定的上下文中实际上是规范的,从某种意义上说,它清楚地表明必须先对其进行测量,然后才能对其进行优化。当然,测量需要确保它只是被测量的一个方面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
相关资源
最近更新 更多