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

标签 java sql multithreading

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

其工作原理如下:

应用程序接收警报,然后在不同的线程中处理这些警报以生成报告。有时,两个警报包含相同的报告,但这不是我们所希望的。

它是一个 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/

相关文章:

java - java类的访问级别

java - jpa2 hibernate,一个测试实体锁定的测试用例

SQL查询从双重返回N行

android - 如何将屏幕分成两个同样大的空间,分别对触摸事件使用react?

c# - 如何使用 WebClient DownloadStringAsync 来避免卡住 UI?

java - 通过 Java 使用 Quicktime 进行录制

java - Windows 上的任务栏图标与 Java 捆绑应用程序

php - SQL查询-间隔问题

sql - 错误 : Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)

c++ - std::atomic_bool 标志的内存顺序