Spring Batch 连接池和多线程

Posted

技术标签:

【中文标题】Spring Batch 连接池和多线程【英文标题】:Spring Batch connection pooling and multithreading 【发布时间】:2018-08-13 05:30:34 【问题描述】:

我有一个带有 Spring Batch 3.0.7 和 Java 8 的 Spring Boot 1.5 应用程序。当计划的作业尝试以 5 个线程启动时,我最近收到了一些连接超时,而另一个长时间运行的批处理作业正在运行。组合的 15 个线程似乎存在对连接的争用。我没有找到任何文档、博客或问题似乎解决了 Spring Batch 中与线程和池的相关性。

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

batcdb (postgres) readdb (oracle) writedb (postgres)

我有 2 份工作:

作业 1(长时间运行)- 最大池大小:10 作业 2(短期运行)- 最大池大小:5

我已经多次重现此错误。

我想尝试一些不同的东西,所以我将我的 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 个线程,这将告诉我 threading/taskExecutor 的行为符合预期。

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

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

【问题讨论】:

你确定有更多的并发请求要使用线程池中的这 10 个空闲线程吗? 我查看了我的设置并意识到我设置了throttle-limit: 10,这似乎是我期望线程和连接之间持续关联的原因。随着节流限制增加到 20,所有 20 个连接都显示为活动的。 超级。可以把它作为答案并接受它,这样它就不会留在未回答的池中。 最终我希望从这个问题中得到的是更好地理解 Job 的 TaskExecutor 和连接池中的连接之间的相关性。我希望源连接主要用于初始“读取”-页面大小:5000;块大小:250; core-pool-size: 20 - 然后使用不同的数据源继续处理 - 处理速度很慢,所以“readdb”连接理论上应该是空闲的。为什么每个线程都需要保持自己的“readdb”数据源连接? 您当前的问题只是关于为什么会有10个线程的差距,如果您对执行器服务的池大小或其他任何其他问题,请打开一个新问题。 【参考方案1】:

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

我的配置:

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

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

【讨论】:

以上是关于Spring Batch 连接池和多线程的主要内容,如果未能解决你的问题,请参考以下文章

Java中的连接池和线程池设置

Java 线程池和多线程编程 ——线程池理解与创建

性能测试连接池和线程

聊聊连接池和线程

转 聊聊连接池和线程

聊聊连接池和线程