我只是在处理多线程应用程序问题时寻求高级建议。
其工作原理如下:
应用程序接收警报
,然后在不同的线程中处理这些警报以生成报告
。有时,两个警报
包含相同的报告
,但这不是我们所希望的。
它是一个 Spring 应用程序,用 Java 编写,使用 MySQL 数据库。
我更改了代码,在保存报告
之前运行 SELECT SQL 查询,该报告会检查是否已存在类似的报告。如果存在,则不会生成报告
。但是,如果同时出现两个Alerts
,则在保存Report #1
之前,会对Report #2
运行SELECT 命令。
我考虑过加入一个随机等待时间为 1-10 秒的 sleep() ,但是当两个线程分配了相同的随机 sleep 时间时,它仍然会导致问题。
我对多线程还很陌生,所以有人有什么想法吗?或者有资源为我指明正确的方向。
非常感谢!!
最佳答案
假设您的代码如下所示:
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 子句选择记录以确保它尚不存在。
关于java - 多线程应用程序 - 用于重复检查的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594527/