多线程性能

时间:2012-09-07 09:20:32

标签: java mysql multithreading performance

我正在编写一个监听UDP传入消息的应用程序。我的主线程在来自网络的消息之后接收消息,并将它们中的每一个传递给新线程以便使用执行程序进行处理。

每个处理线程对其负责的消息执行所需的处理,并将其添加到所有处理线程之间共享的LinkedBlockingQueue

然后,我有一个数据库工作线程,它通过10000条消息块排空队列,并在数据库中插入消息块。

由于消息的到达率可能很高(每秒超过20000条消息),我认为使用LOAD DATA INFILE更有效。因此,此DB工作线程如前所述排空队列,使用CSV格式创建包含所有消息的临时文件,并使用另一个执行程序将创建的文件传递到另一个线程。这个新线程使用LOAD DATA INFILE执行JDBC语句。

在测试我的应用程序后,我认为性能不太好,我正在寻找提高多线程级别和数据库访问级别性能的方法。

我确切地说我使用MySQL作为DBMS。

由于

2 个答案:

答案 0 :(得分:3)

您需要确定性能差的原因。

E.g。如果您将数据按顺序写入数据库(很可能是您的瓶颈),则很可能不需要多个线程。在不需要时使用多个线程的问题是它增加了复杂性,这本身就是一种开销,并且它可能比使用单个线程更慢。

如果您执行所有操作但将数据加载到数据库中,我会尝试查看性能是什么样的。即写入文件并丢弃。

答案 1 :(得分:0)

没有任何探查器输出很难分辨,但我的(未经)教育的猜测是,瓶颈在于您正在将更改写入硬盘驱动器上的文件,然后提示您的数据库读取并解析此文件。存储访问总是比内存访问慢得多。所以这很可能比从内存中提供数据库的查询慢得多。

但那只是在猜测。也许瓶颈是你或我从未预料到的其他地方。当您真的想知道应用程序的哪个部分占用了多少CPU时间时,您应该使用Profiler4j之类的分析器来分析您的程序。