首页 > 解决方案 > 多线程创建多个对象,性能不佳 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 对象。我该如何解决这个问题?以及如何提高我的代码性能?

标签: javamultithreadinghibernate

解决方案


推荐阅读