java - 如何使用 JPA 和 Hibernate 的多个处理线程来持久化实体

标签 java multithreading spring hibernate transactions

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

我正在使用 Spring 和 Hibernate。

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

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

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

  3. oracle db 中的验证、调用服务层、dao 层和存储实体。

此流程使用 for 循环。所以 1 对 1 的数据插入就在那里。

现在我想用多线程来做。

方法:

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

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

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

最佳答案

你可以这样做:

  1. 定义一个 ExecutorService:

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

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

  4. 连接池大小应大于或等于 worker 数量。

与其只向工作线程发送一个实体,不如发送一批多个 List<RecordDTO> 更有效。以便它们都使用单个数据库调用插入。为此,您需要 enable Hibernate JDBC batch inserts .

关于java - 如何使用 JPA 和 Hibernate 的多个处理线程来持久化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28338075/

相关文章:

java - Spring-boot 应用程序不会在 docker 内启动时启动

java - Spring 启动: Cannot access page html on localhost (404)

java - String.codePointAt 到底是做什么的?

java - PipedInputStream 和 PipedOutputStream 中的异常传播

java - 使用 JUnit 时跳过测试类中的方法

android - Recycler View 在它的主框架上做太多的工作

c# - 从 ProcessThreadCollection 按名称获取正在运行的线程

mysql - Spring JPA 多对多关系加载缓慢

java - 跨平台 unicode 支持

Java 玩吧! 2 不重新编译