多线程应用程序-重复检查的SQL查询

时间:2018-10-01 15:40:53

标签: java sql multithreading

在处理多线程应用程序问题时,我只是在寻求高级建议。

这是它的工作方式:

应用程序接收Alerts,然后在不同的线程中对其进行处理以生成Reports。有时,两个Alerts包含相同的Report,但这不是必需的。

这是一个使用MySQL DB用Java编写的Spring应用程序。

在保存Report之前,我更改了代码以运行SELECT SQL查询,以检查是否已经存在类似的报告。如果存在,则不会生成Report。但是,如果两个Alerts同时进入,则在保存Report #2之前,对Report #1运行SELECT命令。

我曾考虑将sleep()的等待时间设置为1-10秒,但是当两个线程分配了相同的随机睡眠时间时,仍然会引起问题。

我对多线程还很陌生,所以有人有什么想法吗?还是有资源为我指明正确的方向。

非常感谢!

1 个答案:

答案 0 :(得分:1)

假设您的代码看起来像这样:

Report report = getReport(...);  // calls the DB to get a record to see if it already exists
if (report == null) {
    insertReport(...);  // add a record to DB which might have already been added by another thread
}

然后,为了避免线程(或JVM)之间的冲突,请将SELECT和INSERT结合在一起。例如:

 insertReportIfNotAlreadyExists(...);

使用的查询结构如下:

INSERT INTO REPORTS (...) VALUES (...)
WHERE NOT EXISTS (...)

使用NOT EXISTS子句选择记录,以确保该记录不存在。