在处理多线程应用程序问题时,我只是在寻求高级建议。
这是它的工作方式:
应用程序接收Alerts
,然后在不同的线程中对其进行处理以生成Reports
。有时,两个Alerts
包含相同的Report
,但这不是必需的。
这是一个使用MySQL DB用Java编写的Spring应用程序。
在保存Report
之前,我更改了代码以运行SELECT SQL查询,以检查是否已经存在类似的报告。如果存在,则不会生成Report
。但是,如果两个Alerts
同时进入,则在保存Report #2
之前,对Report #1
运行SELECT命令。
我曾考虑将sleep()的等待时间设置为1-10秒,但是当两个线程分配了相同的随机睡眠时间时,仍然会引起问题。
我对多线程还很陌生,所以有人有什么想法吗?还是有资源为我指明正确的方向。
非常感谢!
答案 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子句选择记录,以确保该记录不存在。