多线程会创建多个对象,并且Java的性能很差

多线程会创建多个对象,并且Java的性能很差,java,multithreading,hibernate,Java,Multithreading,Hibernate,我有一个创建32个线程的代码。我选择32的原因是数据库中有6400万个实体。我想把它们分成两百万块,分500组加工。下面是我的线程创建代码 private void createReportStartTask() { SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); ExecutorService service = Executors.newFixedThreadPool(32)

我有一个创建32个线程的代码。我选择32的原因是数据库中有6400万个实体。我想把它们分成两百万块,分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));
        }
}
private void createReportStartTask(){
SessionFactory SessionFactory=HibernateUtil.getSessionFactory();
ExecutorService=Executors.newFixedThreadPool(32);
对于(int i=0;i<32;i++){
提交(新报告startCreatorTask(sessionFactory.openSession(),2000000*i));
}
}
如您所见,我从2000000个实体的列表中创建了hibernate会话Receives 500,并在while循环中处理它们。然后,我创建一个reportStart对象,并使用startCgnatLog id设置reportStart的startId。在创建和设置reportStart并处理状态为false的所有startCgnatLog元素之后,我重新运行相同的查询,以从状态为false的2000000列表移动到其他remaning元素。因为startCgnatLog id是唯一的,所以我不希望任何多个reportStart对象具有相同的startId

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();
}
session.beginTransaction();
List startCgnatLogList=session.createQuery(“from…where status=false”).setMaxResults(500).getResultList();
while(startCgnatLogList!=null&&startCgnatLogList.size()>0){
对于(int i=0;i

然而,我假设这是因为多线程,我有近30000000个多reportStart对象和samestartId。我如何解决这个问题?如何提高代码性能?

如果同时启动所有线程,它们都会从数据库中获取相同的500行。因此,它们都以相同的id开始。它们中的所有人都没有相同的id。我正在确保所有id都传递到它创建ReportStartCreatorTask的for循环中。问题是,有多个实体具有相同的id,但并非所有实体都具有相同的id。这可能是因为您没有对数据库端的数据进行排序。如果不对数据进行排序,则无法保证同一查询始终返回相同的数据。我知道数据的顺序是自动递增的,从1开始递增1(id)。如果同时启动所有线程,则它们都从DB中获取相同的500行。因此,它们都以相同的id开始。它们中的所有人都没有相同的id。我正在确保所有id都传递到它创建ReportStartCreatorTask的for循环中。问题是,有多个实体具有相同的id,但并非所有实体都具有相同的id。这可能是因为您没有对数据库端的数据进行排序。如果不对数据进行排序,则无法确保同一查询始终返回相同的数据。我知道数据的顺序是自动递增的,从1开始递增1(id)。