有一个作业在单线程环境中运行。这意味着我有 main 方法,主线程负责完成工作。
我正在使用 Spring 和 Hibernate。
在高层次上,我正在执行以下步骤:
使用 JDBC 从 MySQL 数据库中获取数据(循环结果集并执行第 2 点和第 3 点)
使用从第 1 点收到的数据填充模型。
oracle db 中的验证、调用服务层、dao 层和存储实体。
此流程使用 for
循环。所以 1 对 1 的数据插入就在那里。
现在我想用多线程来做。
方法:
一个线程将获取数据并填充模型对象并将其放入队列中。
多个线程将从队列中取出对象并从点 3 开始。
你能帮我实现这个模型吗?如何编写此类多线程框架。
最佳答案
你可以这样做:
定义一个 ExecutorService:
ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
每个
for
迭代应该简单地提交一批新的要插入的对象:final List<RecordDTO> records = ...; executorService.submit(() -> insertService.save(records); );
insertService
会有一个@Transactional
save
方法。连接池大小应大于或等于 worker 数量。
与其只向工作线程发送一个实体,不如发送一批多个 List<RecordDTO>
更有效。以便它们都使用单个数据库调用插入。为此,您需要 enable Hibernate JDBC batch inserts .
关于java - 如何使用 JPA 和 Hibernate 的多个处理线程来持久化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28338075/