minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Índice
3.1. Método 1: Restrições do banco de dados
3.2. Método 2: Use bloqueios para restringir threads
Os requisitos atuais são: processar dados e armazenar os dados no banco de dados Durante o processo de armazenamento, ele primeiro consultará se os dados foram armazenados no banco de dados. Como os dados a serem processados são muito grandes, um conjunto de threads precisa ser. usado para processamento simultâneo.
Ao escrever lógica usando os métodos acima, haverá problemas de segurança de thread: inserção durante a verificação (problema de inconsistência de dados de consulta de banco de dados), resultando em inserção repetida de dados. Portanto, é necessário adotar meios para limitar o problema da duplicação de dados.
Projete um campo no banco de dados como um índice exclusivo, mesmo que o registro de dados correspondente não seja encontrado durante a consulta (na verdade já existe no banco de dados), uma exceção de erro de campo duplicado será relatada durante a inserção, causando falha na inserção do registro de dados. Para resolver o problema da desduplicação.
Escolha uma estratégia de bloqueio apropriada com base em cenários reais de negócios. O bloqueio otimista é adequado para cenários com menos conflitos de gravação, e o bloqueio pessimista é adequado para cenários com mais conflitos de gravação.
Sincronização de thread: use mecanismos de sincronização comoReentrantLock
、synchronized
etc., para garantir que apenas um thread possa realizar operações de consulta e inserção ao mesmo tempo. O seguinte usa o mecanismo de sincronização de thread e o design de exibição de código:
Código da interface 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);
- }
Crie o código da classe de serviço:
- 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(); // 提交事务
- }
- }
- }
- });
- }
- }
O texto acima é apenas um pequeno caso, o cenário de uso real depende de suas necessidades.Explique o código acima: usandoUserService.class
Como um objeto de bloqueio para garantir que apenas um thread possa realizar operações de consulta e inserção ao mesmo tempo. Isto evita problemas de simultaneidade, mas pode causar gargalos de desempenho, especialmente em cenários de alta simultaneidade. Você pode considerar o uso de bloqueios mais refinados ou bloqueios em nível de banco de dados (como bloqueios pessimistas) para otimizar o desempenho.
A lógica do banco de dados de operação do pool de threads é projetada de acordo com os requisitos, mas há problemas de segurança de thread em todo o processo. Portanto, duas soluções são brevemente apresentadas: ① Definir campos de índice exclusivos na tabela do banco de dados ② Usar bloqueio para garantir a sincronização do thread. Ao usá-lo, ajuste-o de acordo com o cenário real. O processo é escrito de forma relativamente ampla e apenas dois métodos são introduzidos. Se você quiser entendê-lo em profundidade, será necessário estudar mais. Claro, espero poder dar-lhe uma pequena resposta à sua confusão através das minhas pequenas dicas.
A razão pela qual você tem vontade de dormir quando estuda é porque é aí que começam os sonhos.
ଘ(੭ˊᵕˋ)੭ (feliz) ଘ(੭ˊᵕˋ)੭ (feliz) ଘ(੭ˊᵕˋ)੭ (feliz) ଘ(੭ˊᵕˋ)੭ (feliz) ଘ(੭ˊᵕˋ)੭ (feliz)
------Xiao Liu, que não se destacará se não escrever código