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

Spring批处理连接池和多线程

闾丘书
2023-03-14

我有一个Spring Boot 1.5应用程序与Spring Batch 3.0.7和Java8。我最近收到了一些连接超时,当一个计划作业试图从5个线程开始时,而另一个长时间运行的批处理作业正在运行。似乎有15个线程合并的连接争用。我没有找到任何留档、博客或问题,似乎解决了Spring Batch中线程和池的相关性。

我使用HikariCP有3个连接,每个数据源配置为默认值(10个连接):

  • batcdb(postgres)
  • readdb(甲骨文)
  • 写的b(文章)

我有两份工作:

  • 作业1(长期运行)-最大池大小:10

我已经多次重现了这个错误。

我想尝试一些不同的东西,所以我把我的AWS EC2实例类型提升到C4.xlarge,并设置max-pool-size: 20。这是事情变得非常混乱的地方,而不是显示20个连接活动的HikariCP池,它始终保持在10个连接活动,10个连接空闲。这告诉我数字10的某个地方可能有不同的设置?

DEBUG 3054 --- [cdb housekeeper] com.zaxxer.hikari.pool.HikariPool : writedb - Pool stats (total=20, active=10, idle=10, waiting=0)

注意:我还观察到日志中的区块记录输出~20个线程,这将告诉我线程/任务执行器的行为符合预期。

[taskExecutor-1]
...
[taskExecutor-20]

我不希望继续在我的应用程序中抛出更多的连接来允许并发作业运行。如有任何建议和想法,将不胜感激。

共有1个答案

江天宇
2023-03-14

问题是由于核心/最大池大小和油门限制的数量不同。

我的配置

core-pool-size: 20
max-pool-size: 20
throttle-limit: 10

当我将节流限制增加到20时,连接池日志显示所有20个连接都处于“活动”状态。

 类似资料:
  • null 我更新了我的步骤并添加了一个ThreadPoolTaskExecutor,如下所示 在此之后,我的处理器将被多个线程调用,但使用相同的源数据。我还有什么需要做的吗?

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 我目前正在处理一批数据,这些数据来自一个拥有数百万行的大型SQL数据库。 它在处理器中执行一些处理,包括通过带有连接的大型sql查询对从Reader检索到的行进行分组。 编写器将结果写入另一个表。 问题是此Batch存在性能问题,因为Sql选择查询需要大量时间并且步骤不会在多线程中执行。 因此,我希望在多标题中运行它们,但问题是,这些步骤通过计算具有相同类型的所有行的总数来对行进行分组。 因此,如

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 我知道子进程是进程,而不是线程。我使用了错误的语义,因为大多数人在谈到“多线程”时都知道您的意图。所以我会把它保留在标题中。 想象一下这样一个场景:使用一个自定义函数或模块,您连续有多个类似和复杂的事情要做。使用所有可用的核心/线程(例如8/16)非常有意义,这就是的目的。 理想情况下,您需要多个同时工作的人员,并向一个控制器发送/从一个控制器发送/回调消息。 node cpool、fork po

  • 我想编写一个spring boot批处理应用程序,其中我有一个充满事件的数据库表。我想做的是有一个多线程的spring boot批处理应用程序,它将以这种方式工作: 我想有5个线程运行,每个线程将保留一个偏移量来跟踪它读取的事件,以便没有其他线程再次读取相同的事件。我想怎么做: 所以我希望能够在数据库表中为每个线程保留偏移量。有没有办法让Spring Boot环境以这种方式工作?