当前位置: 首页 > 知识库问答 >
问题:

具有多个表插入的多线程

呼延庆
2023-03-14

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

  1. 循环0到50000(所有50000记录彼此独立)
  2. 选择第i个元素
  3. 对第i个元素执行计算(删除CALCULATION_TEMP表(如果存在),创建新表CALCULATION_TEMP并在CALCULATION_TEMP表中插入计算)
  4. 在步骤3表上进行一些计算并得到结果
  5. 将步骤4的结果放入结果表

目前,这些计算都需要大约38个小时来完成单线程。

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

使用单线程大约需要30秒。

使用两个线程:-

  • 由第一个线程执行的一半记录和由第二个线程执行的其余记录。
  • 现在我为两个线程使用两个临时表。(TEMP1和TEMP2)
  • 需要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();
} 

请建议,我如何提高性能

共有2个答案

施权
2023-03-14

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

秦建元
2023-03-14

创建/删除临时表需要花费50000倍的大量时间。没有临时表能做计算吗?可以提高工作效率。

 类似资料:
  • 问题内容: 我想用一个查询插入多个行,例如: 有没有一种方法可以轻松地做到这一点,最好是针对这样的对象数组: 我可能最终将500条记录放在一个块中,因此运行多个查询将是不可取的。 到目前为止,我只能对单个对象执行此操作: 附带的问题:使用符号插入是否可以防止SQL注入? 问题答案: 我是pg-promise的作者。 在旧版本的库中,Performance Boost文章中的简化示例涵盖了这一点,在

  • 问题内容: 嘿,我有一个连接两个不相关表的Junction表。两个表都有。我需要使用不同的值从每个表中选择,例如,这就是我的看法: 我见过的所有示例都使用一条语句,但是两个表具有相同的值,在这种情况下,它们不是。 问题答案: 试试这个查询:

  • 问题内容: 所以我有四个桌子。每个表都有一个与前一个表ID相同的ID。因此,我的点击表中有一个ID和一个广告来源的ID。在广告表中,它有一个广告ID和一个来自其广告系列的ID。所以这是一个例子。 因此,要找出表4中的值从何而来,我需要遍历每个表并检查它们具有哪个ID。基本上,我想知道表1中的哪些值与表4中的值相关联。 表4中的内容是网站的访问者,表1中的内容是互联网广告。我想知道哪些访客来自哪些广

  • 我在节点js代码中有2个数组 我试着用一个数组来做。它成功地执行了,但它不能与2个数组一起工作。我应该怎么做呢? 我为一个数组编写的Mysql插入查询如下所示:

  • 问题内容: 我想从select语句插入到表中,但是,从select语句返回3列,并且该表有4列,我想为额外列中的所有行添加0。谁能给我一个示例SQL查询吗? 谢谢! 问题答案: 只需在您的选择中添加“ 0”即可。

  • 问题内容: 我正在尝试使用Linq / EntityFramework将数据从C#应用程序保存到数据库中。插入到一个表很简单,但是我不确定如何将数据插入到三个都与自动增量标识互连的表中?这是一个小问题,所以我使用一个线程及其所有帖子- 每个 ThreadTitle 和每个 Post 都与一个 User (不是实际的表名)相关联。 我的设计思想是将完整线程刮入内存,然后进行“批量”插入。为了减少负载