Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程性能_Java_Mysql_Multithreading_Performance - Fatal编程技术网

Java 多线程性能

Java 多线程性能,java,mysql,multithreading,performance,Java,Mysql,Multithreading,Performance,我正在编写一个应用程序,在UDP上侦听传入消息。我的主线程接收来自网络的一条又一条消息,并将它们传递给一个新线程,以便使用执行器进行处理 每个处理线程对其负责的消息执行所需的处理,并将其添加到所有处理线程之间共享的LinkedBlockingQueue 然后,我有一个DB worker线程,它按10000条消息块耗尽队列,并将消息块插入DB中 由于消息的到达率可能很高(每秒超过20000条消息),我认为使用LOAD DATA infle更有效。因此,这个DB工作线程如前所述耗尽队列,使用CSV格

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

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

然后,我有一个DB worker线程,它按10000条消息块耗尽队列,并将消息块插入DB中

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

在测试了我的应用程序之后,我认为性能不是很好,我正在寻找提高多线程级别和DB访问级别性能的方法

我知道我使用MySQL作为DBMS


谢谢

您需要确定绩效不佳的原因

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


如果您除了将数据加载到数据库之外什么都做,我会尝试看看性能如何。i、 e.写入文件并将其丢弃。

如果没有任何探查器输出,很难说清楚,但我(未受过教育的)猜测是,瓶颈在于您正在将更改写入硬盘上的文件,然后提示数据库读取和解析此文件。存储访问总是比内存访问慢得多。因此,这很可能比从内存向数据库提供查询慢得多


但那只是猜测而已。也许瓶颈在你我都没想到的地方。当您确实想知道应用程序的哪个部分占用了多少CPU时间时,您应该使用Profiler4j之类的探查器来分析您的程序

我只能使用没有子线程的DB工作线程。在这种情况下,文件将由该DB工作线程一个接一个地写入DB。但是我认为在编写文件的过程中(同步JDBC调用),我可以利用这段时间向DB发出另一个文件。你认为这是没有必要的吗?如果不衡量每个阶段的不同程度,就不可能知道。即使有12年优化Java程序的经验,我也很惊讶您通过测量系统性能而不是猜测得到的结果。关于如何测量多线程应用程序的性能,您是否有一些资源可以提供给我?我想知道system.nanoTime()需要多长时间或者删除流程的一部分,看看哪些位“保持”不变。你可以使用商用的CPU和内存分析器,这将有助于提高性能,但除非你做了基础研究,否则你不会知道你是否在优化某些东西,这将产生影响。我已经做了一些测试。通过删除将消息写入数据库的部分,我没有性能问题。当我启用DB写入时,LinkedBlockingQueue的大小会不断增长,因为到达率大于DB写入率。我试图提高DB写入的性能,但我不知道如何提高。关于访问硬盘驱动器,我认为我没有选择。最后,我希望我的消息在数据库中,因为使用加载数据填充更有效,所以我必须将消息写入文件中,除非另有可能?