Java 具有多表插入的多线程

Java 具有多表插入的多线程,java,multithreading,spring,hibernate,transactions,Java,Multithreading,Spring,Hibernate,Transactions,我正在开发基于Spring+Hibernate的web应用程序。 在这个应用程序中,我必须对数据库中可用的50000条记录进行计算。 当前逻辑:- 循环0到50000(所有50000条记录彼此独立) 选择第i个元素 对第i个元素进行计算(删除计算温度表(如果存在),创建新表,并在计算温度表中插入计算) 在步骤3表格上进行一些计算并得到结果 将步骤4的结果放入结果表格 目前,所有这些计算都需要大约38小时才能完成,只有一个线程。 现在我们希望通过多个线程运行这个系统。 为了测试的目的,我拍了50张

我正在开发基于Spring+Hibernate的web应用程序。 在这个应用程序中,我必须对数据库中可用的50000条记录进行计算。 当前逻辑:-

  • 循环0到50000(所有50000条记录彼此独立)
  • 选择第i个元素
  • 对第i个元素进行计算(删除计算温度表(如果存在),创建新表,并在计算温度表中插入计算)
  • 在步骤3表格上进行一些计算并得到结果
  • 将步骤4的结果放入结果表格
  • 目前,所有这些计算都需要大约38小时才能完成,只有一个线程。

    现在我们希望通过多个线程运行这个系统。 为了测试的目的,我拍了50张唱片

    使用单线程大约需要30秒

    使用两个线程:-

    • 一半记录由第一个线程执行,其余记录由第二个线程执行
    • 现在我为两个线程使用两个临时表。(临时1和临时2)
    • 这需要225秒
    粗略代码:-

    for (int i = 0; i < recordsSize; i++) {
        final int j = i;
        String recordId = list.get(i);
    
        // Method call : Code for creating CALCULATION_TEMP table
        // CALCULATION_TEMP table will contain dynamic number of column. It is depends on the record data (50 to 70 columns)
        // return flag value
        boolean flag = xyzMethod(....);
    
        if (flag) {
    
            // All calculation done in this method 
            // Around 600 - 700 rows will be created into CALCULATION_TEMP table on the basis of calculation logic
            Object fileMapColumnData[] = /* Method call */;
    
            // Insert result for one record into RESULT table for unique recordId (this result is calculated in CALCULATION_TEMP table)  
            insertIntoResultTable(....);
    
            // Drop CALCULATION_TEMP table
        } else {
            LOGGER.error("Unable to calculate ... because of some wrong data");
            loggerDTO.getCustomLogger().severe("Unable to calculate ... because of some wrong data");
        }
        if (i % 100 == 0) {
            calculationDao.flushAndClear();
        }
    
        // Thread for showing process completion status in percentage
        Thread t = new Thread() {
            @Override
            public void run() {
                getPercentageDone((float) recordsSize, (float) (j + 1));
            }
        };
        t.start();
    } 
    
    for(int i=0;i

    请建议如何提高性能。

    创建/删除临时表需要花费50000次的大量时间。没有临时表格你能计算吗?它可以提高性能。

    性能改进没有硬性规定。如果您有约束和业务决策,我们需要知道计算和线程如何被管理、连接被管理以及涉及的循环数等等。有太多的事情要考虑。首先检查痛点区域、所用时间,并首先改进每种方法。

    不能使用不同键的同一临时表吗?另外,你确定你不能在DB中通过简单的过程来实现这个计算吗?它更像是提到的@Aksapy的DB端工作,而不是Java端。一个临时表引用一个结果。所以我们不能使用相同的临时表。根据客户要求,我们不能使用存储过程,我不知道您的计算。使用SQL GROUP或COUNT函数计算元素怎么样?计算非常复杂。我每个月都要做计算。比如一张唱片,我有20年的数据。因此,将使用每个记录的动态列数(大约50到70)创建20*12=240行。这就是我需要为每条记录重新创建表的原因。线程的行为方式与您对其进行编码的方式相同。在看不到代码的情况下,我只能想象你的线程在等待某个东西完成a.k.a锁。此外,您的连接忙吗?正在使用什么类型的查询?正如我所说,没有单一的答案。@RahulJain-整个程序执行需要225秒,包括创建表和查询等吗?或者这只是你对25条记录的计算逻辑?它只适用于50条记录。使用单线程需要30秒,但使用两个线程需要225秒左右。@RahulJain。。增加线程数后的性能取决于运行代码的机器。在使用Core 2 DUO处理器开发时使用4GB RAM。