3

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

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

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

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

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

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

谢谢

4

2 回答 2

3

你需要确定为什么你的表现很差。

例如,如果您将数据顺序写入数据库,这很可能是您的瓶颈,那么您很可能不需要多个线程。在不需要时使用多线程的问题在于它增加了复杂性,这本身就是一种开销,而且它可能比使用单线程慢。

如果您只将数据加载到数据库中,我会尝试看看性能如何。即写入文件并丢弃它。

于 2012-09-07T09:24:27.897 回答
0

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

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

于 2012-09-07T09:25:57.613 回答