Обмен технологиями

В базе данных операций пула потоков существуют проблемы с безопасностью потоков.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Оглавление

1. Введение

2. Вопрос

3. Решение

3.1. Способ 1: ограничения базы данных.

3.2. Способ 2. Используйте блокировки для ограничения потоков.

4. Резюме


1. Введение

Текущие требования: обработка данных и сохранение их в базе данных. В процессе хранения сначала выполняется запрос, сохранены ли данные в базе данных. Поскольку обрабатываемые данные слишком велики, необходимо создать пул потоков. используется для одновременной обработки.

2. Вопрос

При написании логики с использованием вышеуказанных методов возникнут проблемы с безопасностью потоков: вставка во время проверки (проблема несогласованности данных запроса к базе данных), что приведет к повторной вставке данных. Поэтому необходимо принять меры по ограничению проблемы дублирования данных.

3. Решение

3.1. Способ 1: ограничения базы данных.

Создайте поле в базе данных как уникальный индекс. Даже если соответствующая запись данных не найдена во время запроса (на самом деле она уже существует в базе данных), во время вставки будет сообщено об исключении ошибки дублирования поля, что приведет к сбою вставки записи данных. Решить проблему дедупликации.

3.2. Способ 2. Используйте блокировки для ограничения потоков.

Выберите подходящую стратегию блокировки на основе реальных бизнес-сценариев. Оптимистическая блокировка подходит для сценариев с меньшим количеством конфликтов записи, а пессимистическая блокировка подходит для сценариев с большим количеством конфликтов записи.

Синхронизация потоков: используйте механизмы синхронизации, такие какReentrantLocksynchronized и т. д., чтобы гарантировать, что только один поток может выполнять операции запроса и вставки одновременно. Ниже используется механизм синхронизации потоков и дизайн отображения кода:

код интерфейса mybatis:

  1. import org.apache.ibatis.annotations.*;
  2. public interface UserMapper {
  3. @Select("SELECT COUNT(*) FROM user WHERE username = #{username}")
  4. int countByUsername(@Param("username") String username);
  5. @Insert("INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})")
  6. @Options(useGeneratedKeys = true, keyProperty = "id")
  7. int insertUser(User user);
  8. }

Создайте код класса обслуживания:

  1. import org.apache.ibatis.session.SqlSession;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. public class UserService {
  6. private final ExecutorService executorService;
  7. private final SqlSessionFactory sqlSessionFactory;
  8. public UserService(SqlSessionFactory sqlSessionFactory) {
  9. this.sqlSessionFactory = sqlSessionFactory;
  10. // 创建固定大小的线程池
  11. this.executorService = Executors.newFixedThreadPool(10);
  12. }
  13. public void addUser(User user) {
  14. executorService.submit(() -> {
  15. try (SqlSession session = sqlSessionFactory.openSession()) {
  16. UserMapper userMapper = session.getMapper(UserMapper.class);
  17. synchronized (UserService.class) {
  18. // 在同步块内执行查询和插入操作
  19. if (userMapper.countByUsername(user.getUsername()) == 0) {
  20. userMapper.insertUser(user);
  21. session.commit(); // 提交事务
  22. }
  23. }
  24. }
  25. });
  26. }
  27. }

Вышеупомянутое — всего лишь небольшой случай, реальный сценарий использования зависит от ваших потребностей.Объясните приведенный выше код: используяUserService.class В качестве объекта блокировки, гарантирующего, что только один поток может одновременно выполнять операции запроса и вставки. Это позволяет избежать проблем с параллелизмом, но может привести к снижению производительности, особенно в сценариях с высоким параллелизмом. Вы можете рассмотреть возможность использования более точных блокировок или блокировок на уровне базы данных (например, пессимистических блокировок) для оптимизации производительности.

4. Резюме

Логика работы базы данных пула потоков разработана в соответствии с требованиями, но во всем процессе существуют проблемы с безопасностью потоков. Поэтому кратко представлены два решения: 1. Установка уникальных индексных полей в таблице базы данных. 2. Использование блокировки для обеспечения синхронизации потоков. При его использовании корректируйте его в соответствии с реальным сценарием. Процесс написан относительно широко, и представлены только два метода. Если вы хотите понять его глубже, вам необходимо изучить его дальше. Конечно, я надеюсь, что смогу дать вам небольшой ответ на ваше замешательство с помощью своих маленьких советов.


Причина, по которой вам хочется спать во время учебы, заключается в том, что именно здесь начинаются сны.
ଘ(੭ˊᵕˋ)੭ (счастливый) ଘ(੭ˊᵕˋ)੭ (счастливый) ଘ(੭ˊᵕˋ)੭ (счастливый) ଘ(੭ˊᵕˋ)੭ (счастливый) ଘ(੭ˊᵕˋ)੭ (счастливый)
------Сяо Лю, который не станет выдающимся, если не будет писать код