如何通过 JPA 和 Hibernate 使用多个处理线程来持久保存实体

VJS*_*VJS 2 java spring multithreading hibernate transactions

有一项作业正在单线程环境中运行。这意味着我有 main 方法,主线程负责完成工作。

我正在使用 Spring 和 Hibernate。

在高层次上,我正在执行以下步骤:

  1. 使用 JDBC 从 MySQL 数据库获取数据(循环结果集并执行第 2 点和第 3 点)

  2. 使用从点 1 接收的数据填充模型。

  3. 验证、调用服务层、dao层以及在oracle db中存储实体。

此流程使用for循环。所以1×1的数据插入就存在了。

现在我想使用多线程来做到这一点。

方法 :

  1. 一个线程将获取数据并填充模型对象并将其放入队列中。

  2. 多个线程将从队列中取出对象并从点 3 开始。

你能帮我实现这个模型吗?如何编写这种类型的多线程框架。

Vla*_*cea 6

你可以这样做:

  1. 定义一个ExecutorService:

     ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 每次for迭代应该简单地提交一批要插入的新对象:

     final List<RecordDTO> records = ...;
     executorService.submit(() -> 
         insertService.save(records);
     );
    
    Run Code Online (Sandbox Code Playgroud)
  3. 会有insertService一个@Transactional save方法。

  4. 连接池大小应大于或等于工作线程数。

与仅将一个实体发送到工作线程不同,发送一批多个实体会更有效,List<RecordDTO>以便使用单个数据库调用将它们全部插入。为此,您需要启用 Hibernate JDBC 批量插入