Spring Batch数据库连接不可用,请求超时

时间:2018-12-19 21:08:58

标签: spring spring-data-jpa spring-batch

在使用Spring Batch处理一个项目的过程中,我遇到了以下问题。该项目包括:

  • MySQL数据库(mysqld 10.2.13-MariaDB)
  • Spring Boot(2.1.1.RELEASE)
  • 春季批次(4.1.0.RELEASE)
  • 将Spring Batch配置为使用与JobRepository的业务逻辑相同的数据源

数据源的hikari连接池大小配置为4(这是将应用程序插入CloudFoundry实例并在Spring的自动重配置过程中注入时的默认值) 作为参考,您可以看一下示例项目,在该项目中我创建了一个最小化项目来重现该问题: https://github.com/FlorianSW/spring-batch-connection-issue

问题: 给定您有一个控制器,该控制器处理一个至少发生两件事的RequestMapping:控制器再次执行任意操作,然后再次执行业务模型数据库架构(例如,从数据库中保存或请求实体),然后通过以下步骤启动Spring Batch作业:致电JobLauncher#run。 Spring Batch配置为使用池大小为1的ThreadPoolTask​​Executor运行异步任务。

如果请求映射每秒仅查询几次(大约为1-3次),则效果很好。但是,如果查询到的映射不止于此,例如,以同步方式(如果在本地进行测试),假设4+次(在测试中我使用了4个和多达20个请求),则请求会陷入死锁,其中一些将被终止,但有以下异常:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Could not obtain last_insert_id(); nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 5001ms.]

将连接池的大小增加到至少7时,可以缓解此问题(我不知道此数字可能来自何处)。重新启动应用程序并执行我的测试JavaScript代码[1]以调度多个请求之后,我可以轻松地将获取请求的数量增加到150,并且应用程序将毫无问题地处理这些请求(如预期的那样)。在增加池大小之前,许多请求都在一个超时中运行。

我不确定,是否将其视为错误或改进或其他内容,并且我不确定该组件是文档还是类似的东西,但是,我打算这样做的目的是:

是否发现Spring Batch与Spring Boot一起需要数据库连接池中的可用连接数最少?如果是这样,应该在文档中提及吗? 或者,如果这是一个错误,因为请求处理期间使用的JDBC连接不会在合理的短时间内返回到池中?

[1]

for (i = 0; i <= 150; i++) {fetch('http://localhost:8080/api/jobs/' + i, {method: 'PUT'})}

0 个答案:

没有答案