моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Оглавление
3.1. Способ 1: ограничения базы данных.
3.2. Способ 2. Используйте блокировки для ограничения потоков.
Текущие требования: обработка данных и сохранение их в базе данных. В процессе хранения сначала выполняется запрос, сохранены ли данные в базе данных. Поскольку обрабатываемые данные слишком велики, необходимо создать пул потоков. используется для одновременной обработки.
При написании логики с использованием вышеуказанных методов возникнут проблемы с безопасностью потоков: вставка во время проверки (проблема несогласованности данных запроса к базе данных), что приведет к повторной вставке данных. Поэтому необходимо принять меры по ограничению проблемы дублирования данных.
Создайте поле в базе данных как уникальный индекс. Даже если соответствующая запись данных не найдена во время запроса (на самом деле она уже существует в базе данных), во время вставки будет сообщено об исключении ошибки дублирования поля, что приведет к сбою вставки записи данных. Решить проблему дедупликации.
Выберите подходящую стратегию блокировки на основе реальных бизнес-сценариев. Оптимистическая блокировка подходит для сценариев с меньшим количеством конфликтов записи, а пессимистическая блокировка подходит для сценариев с большим количеством конфликтов записи.
Синхронизация потоков: используйте механизмы синхронизации, такие какReentrantLock
、synchronized
и т. д., чтобы гарантировать, что только один поток может выполнять операции запроса и вставки одновременно. Ниже используется механизм синхронизации потоков и дизайн отображения кода:
код интерфейса mybatis:
- import org.apache.ibatis.annotations.*;
-
- public interface UserMapper {
- @Select("SELECT COUNT(*) FROM user WHERE username = #{username}")
- int countByUsername(@Param("username") String username);
-
- @Insert("INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})")
- @Options(useGeneratedKeys = true, keyProperty = "id")
- int insertUser(User user);
- }
Создайте код класса обслуживания:
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
-
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
-
- public class UserService {
- private final ExecutorService executorService;
- private final SqlSessionFactory sqlSessionFactory;
-
- public UserService(SqlSessionFactory sqlSessionFactory) {
- this.sqlSessionFactory = sqlSessionFactory;
- // 创建固定大小的线程池
- this.executorService = Executors.newFixedThreadPool(10);
- }
-
- public void addUser(User user) {
- executorService.submit(() -> {
- try (SqlSession session = sqlSessionFactory.openSession()) {
- UserMapper userMapper = session.getMapper(UserMapper.class);
-
- synchronized (UserService.class) {
- // 在同步块内执行查询和插入操作
- if (userMapper.countByUsername(user.getUsername()) == 0) {
- userMapper.insertUser(user);
- session.commit(); // 提交事务
- }
- }
- }
- });
- }
- }
Вышеупомянутое — всего лишь небольшой случай, реальный сценарий использования зависит от ваших потребностей.Объясните приведенный выше код: используяUserService.class
В качестве объекта блокировки, гарантирующего, что только один поток может одновременно выполнять операции запроса и вставки. Это позволяет избежать проблем с параллелизмом, но может привести к снижению производительности, особенно в сценариях с высоким параллелизмом. Вы можете рассмотреть возможность использования более точных блокировок или блокировок на уровне базы данных (например, пессимистических блокировок) для оптимизации производительности.
Логика работы базы данных пула потоков разработана в соответствии с требованиями, но во всем процессе существуют проблемы с безопасностью потоков. Поэтому кратко представлены два решения: 1. Установка уникальных индексных полей в таблице базы данных. 2. Использование блокировки для обеспечения синхронизации потоков. При его использовании корректируйте его в соответствии с реальным сценарием. Процесс написан относительно широко, и представлены только два метода. Если вы хотите понять его глубже, вам необходимо изучить его дальше. Конечно, я надеюсь, что смогу дать вам небольшой ответ на ваше замешательство с помощью своих маленьких советов.
Причина, по которой вам хочется спать во время учебы, заключается в том, что именно здесь начинаются сны.
ଘ(੭ˊᵕˋ)੭ (счастливый) ଘ(੭ˊᵕˋ)੭ (счастливый) ଘ(੭ˊᵕˋ)੭ (счастливый) ଘ(੭ˊᵕˋ)੭ (счастливый) ଘ(੭ˊᵕˋ)੭ (счастливый)
------Сяо Лю, который не станет выдающимся, если не будет писать код