繁体   English   中英

用jdbc和mysql并行化查询是否值得?

[英]Is it worth to parallelize queries with jdbc and mysql?

一个jdbc“ select”语句需要5秒钟才能完成。 因此,执行5条语句需要25秒。

现在,我尝试并行完成这项工作。 该数据库是带有innodb的mysql。 我开始5个线程,并给每个线程自己的数据库连接。 但是,完成所有任务还需要25秒吗?

请注意,我为Java提供了足够的堆,并具有8个内核,但只有一个hd(这里的瓶颈可能只有一个hd?)

这是mysql开箱即用的预期功能吗? 这是示例代码:

public void doWork(int n) {
        try (Connection conn = pool.getConnection();
             PreparedStatement stmt = conn.prepareStatement("select id from big_table where id between "+(n * 1000000)" and " +(n * 1000000 +1000000));
        ) { 
            try (ResultSet rs = stmt.executeQuery();) {
                while (rs.next()) {
                    Long itemId = rs.getLong("id");
                }
            }
        }
}

public void doWorkBatch() {
    for(int i=1;i<5;i++)
        doWork(i);
}

public void doWorkParrallel() {
    for(int i=1;i<5;i++)
        new Thread(()->doWork(i)).start();
    System.console().readLine();
}

(我不记得在哪里,但我读到标准的mysql安装可以轻松地并行处理1000个连接)

这取决于系统瓶颈在哪里。如果每个查询花费几秒钟来建立与数据库的连接,而实际运行查询的只是其中的一小部分,您会看到一个不错的改进。 但是,如果花时间在mysql上,并运行实际的查询,则不会有太大的区别。

我要做的第一件事不是优化并发执行,而是优化查询,也许将索引添加到表中,等等。

并发执行可能会更快。 您还应该考虑批量执行。

如果有并行处理的空间,并发执行将有所帮助。 在您的情况下,似乎没有并行化的空间,因为您有一个非常简单的查询,该查询执行顺序读取大量数据,因此,瓶颈可能是磁盘传输,然后是从服务器到服务器的数据传输。客户。

当我们说RDBMS服务器每秒可以处理数千个请求时,我们通常是在谈论我们通常在Web应用程序中看到的那种请求,其中每个SQL查询都比您的查询稍微复杂一些,但磁盘读取量却少得多(因此它们很可能会在缓存中找到)和较小的数据传输(适合网页的内容)。

看着您的问题肯定是多线程的,这将改善您的性能,因为即使我曾经通过完全按照您的想法进行操作,将4-5小时的批处理作业转换为7-10分钟的作业,但您需要先了解以下内容设计时需要手:

1)您需要考虑任务间的依赖性,即任务在不同线程上执行。

2)使用连接池是一个好兆头,因为在Java中创建数据库连接是一个缓慢的过程,需要很长时间。

3)每个线程都需要自己的JDBC连接。 连接不能在线程之间共享,因为每个连接也是事务。

4)将任务分为几个工作单元,每个单元执行一项工作。

5)特别适合您的情况,即使用mysql。 您使用的数据库引擎也会影响性能,因为InnoDB引擎使用行级锁定。 这样,它将处理更高的流量。 但是,(通常)替代方法(MyISAM)不支持行级锁定,它使用表锁定。 我正在谈论这种情况,如果另一个线程进入并想在第一个线程提交之前更新同一行该怎么办。

6)为了提高Java数据库的性能,应用程序正在使用setAutoCommit(false)运行查询。 默认情况下,新的JDBC连接的自动提交模式为ON,这意味着每个单独的SQL语句将在其自己的事务中执行。 在没有自动提交的情况下,您可以将SQL语句分组为逻辑事务,可以通过调用commit()或rollback()来提交或回滚该逻辑事务。

您还可以签出专为批处理而设计的springbatch。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM