java - 在 Spring boot 中使用两个执行器运行并行作业

标签 java oracle spring-boot executorservice hikaricp

我创建了一个 Spring Boot 应用程序,它将接受作业请求并在后台运行它们。 这些作业请求非常密集,如果通过单线程处理,将需要 4-5 个小时。 在内部,这些工作请求有单独的较小任务,约为 300-400 个。所以我创建了一个任务执行器来并行处理它们。它很有魅力,35 分钟内就完成了一切。但当另一个作业与该作业并行运行时,问题就出现了。现在,同样的工作需要 2 个小时。最初,我认为可能有一项工作正在占用所有线程并让其他工作等待。因此,为了解决这个问题,我创建了另一个执行器并将它们分配给每个作业。但没有任何改善。

顺便说一句,内部任务是内部调用数据库。

下面是任务执行器的配置以及我如何使用 on 方法。

    @Bean(name = "taskExecutor")
    public Executor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(100);
        executor.setMaxPoolSize(200);
        executor.setQueueCapacity(200);
        executor.setThreadNamePrefix("Thread1-");
        executor.initialize();
        return executor;
    }

    @Bean(name = "exTaskExecutor")
    public Executor exThreadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(30);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("Thread2-");
        executor.initialize();
        return executor;
    }

    @Async("taskExecutor")
    public void job1()
        //do something  
    }

    @Async("exTaskExecutor")
    public void job2()
        //do something  
    }

   //database connections
   spring.datasource.hikari.connectionTimeout=60000
   spring.datasource.hikari.idleTimeout=600000
   spring.datasource.hikari.maxLifetime=1800000 
   spring.datasource.hikari.autoCommit=true
   spring.datasource.hikari.maximumPoolSize=120
   spring.datasource.hikari.connection-test-query: SELECT 1 FROM DUAL

我不明白问题出在哪里?是在任务执行器中还是 HikariCP 中? 我从日志中可以看到的是来自两个执行器的线程在任何时间点都没有并行运行。 任何帮助或替代方式都将受到高度赞赏。

最佳答案

这里的主要问题是您拥有的可用处理器数量,您只能并行运行n个线程(n == availableProcessors)等于可用处理器数量和剩余数量将同时运行,例如您可以使用 Runtime 类检查可用处理器

Runtime.getRuntime().availableProcessors() // In my case 8

我确实拥有总共 4 核心超线程处理器,其中每个核心可以并行处理两个线程,并且铰孔线程将同时运行,you can find the difference between parallel and concurrent您还可以在这里了解更多信息 Java threads and number of cores

关于java - 在 Spring boot 中使用两个执行器运行并行作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58863861/

相关文章:

java - 如何将开始日期和结束日期作为参数从 jsp 页面到 jasper 报告

sql - super 键、候选键和主键

java - @ConfigurationProperties 注解的警告

java - 无法理解在下面的类(class)中如何完成自动接线

java - 是反模式将 Spring 组件转移到 Spring 上下文之外的某个类吗?

java - Spring Security 和 OAuth2 之间的 Primary 接口(interface)的两种不同实现

java - Spring - 使用注释设置属性值而不使用属性文件

node.js - 测试从 nodejs 应用程序到 Oracle DB 的连接

php - Oracle 11.1.0.7 和 WAMP oci_connect 失败

java - 用于本地 Spring Boot 开发的 Docker-Compose