gpt4 book ai didi

Java 并发查询同一表以进行电子邮件处理

转载 作者:行者123 更新时间:2023-12-02 03:42:17 25 4
gpt4 key购买 nike

我有一个充当电子邮件队列的 MySQL 表 - 保存需要发送的所有记录。我正在尝试使用多个线程发送每封电子邮件。每个线程都必须对此电子邮件队列表进行查询,以获取一组记录,然后将这些记录发送到表中并从表中删除。

如何决定每个线程将从表中获取哪些记录?从那里,您如何管理这些并发查询?我正在使用 Java Spring Boot 和 Hibernate。

最佳答案

我想像下面这样。这是使用数据库中行的 id 来完成的。如果你有巨大的身份差距,这并不是一个好的解决方案。您可以重构它以使用某些日期列或任何其他有助于批量记录的数据。

10 - 线程数

i - 我们正在迭代的当前线程数

10000 - 批量大小,用于获取批量 10000 封电子邮件

counter - 用于了解哪个线程应负责哪个 id 批处理的变量

maximumEmailId - 电子邮件表中电子邮件的最大 ID

1. Create 10 numbered threads - 0, 1, 2..., 9
2. Start every thread
3. For each thread number (i):
4. For counter = 0, step 10000
5. if (counter / 10000) % 10 == i then
- SELECT * FROM emails WHERE id BETWEEN (counter) AND (counter + 10000)
- Send emails
6. if counter > maximumEmailId then break;

它的行为如下:

iteration 0:
-thread 0 - counter = 0 - select ... where id between 0 and 10000
-thread 1 - counter = 10000 - select ... where id between 10000 and 20000
-thread 9 - counter = 90000 - select ... where id between 90000 and 100000

iteration 1:
-thread 0 - counter = 100000 - select ... where id between 100000 and 11000
-thread 1 - counter = 110000 - select ... where id between 110000 and 12000
-thread 9 - counter = 190000 - select ... where id between 190000 and 20000

基本上,这个解决方案与锁定、技术并发技巧等无关,您只需划分数据集,这样就没有人会尝试读取同一批处理。想象一下地面上有 100 个盒子,线程 0 取出编号为 0, 10, 20,...,90 的盒子,线程 1 取出盒子 1, 11, 21,...,91

关于Java 并发查询同一表以进行电子邮件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com