java - 多线程创建多个对象,性能不佳 Java
问题描述
我有一个创建 32 个线程的代码。我选择 32 的原因是我在数据库中有 6400 万个实体。我想将它们分成 200 万个,并按 500 个组进行处理。我的线程创建代码如下。
private void createReportStartTask() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
ExecutorService service = Executors.newFixedThreadPool(32);
for (int i = 0; i < 32; i++) {
service.submit(new ReportStartCreatorTask(sessionFactory.openSession(), 2000000 * i));
}
}
如您所见,我从 2000000 个实体列表中创建了休眠会话接收 500 个,并在 while 循环中处理它们。然后我创建了一个 reportStart 对象,并将 reportStart 的 startId 设置为 startCgnatLog id。在创建和设置 reportStart 并处理所有 status=false 的 startCgnatLog 元素后,我重新运行相同的查询以从 2000000 列表中的 status=false 移动到其他 remaning 元素。由于 startCgnatLog id 是唯一的,我不希望任何具有相同 startId 的多个 reportStart 对象。
session.beginTransaction();
List<StartCgnatLog> startCgnatLogList = session.createQuery("from ... where status=false").setMaxResults(500).getResultList();
while (startCgnatLogList != null && startCgnatLogList.size() > 0) {
for (int i = 0; i < startCgnatLogList.size(); i++) {
StartCgnatLog startCgnatLog = startCgnatLogList.get(i);
reportStart.setStartId(startCgnatLog.getId());
session.save(reportStart);
startCgnatLog.setStatus(true);
session.update(startCgnatLog);
}
session.flush();
session.clear();
session.getTransaction().commit();
session.beginTransaction();
startCgnatLogList = session.createQuery("from ... where status=false").setMaxResults(500).getResultList();
}
但是,我认为这是因为多线程我有近 30000000 个具有相同startId 的多个reportStart 对象。我该如何解决这个问题?以及如何提高我的代码性能?
解决方案
推荐阅读
- sql - 使用 sequelize 计算 where 查询编码
- python - df。drop 导致 &: 'float' 和 'bool' 的操作数类型不受支持
- javascript - 在滚动时隐藏导航栏不会使导航栏在向上滚动后固定到位
- ios - UNUserNotificationCenterDelegate didReceive 响应没有被调用
- shopify - 如何在自定义 shopify 部分中添加 url 选项
- javascript - 如何检查 AJAX 请求的成功/错误回调?
- excel - 将文本添加到消息框输出
- sql - Spring data jpa for between search:区别Between还是IsBetween?
- groovy - 无法将 XMLSlurper 结果推送到 Set
- python - 如何解决这个问题?Python从列表中的函数返回对象