在为一个项目使用springbatch的过程中,我遇到了以下问题。项目包括:
-
-
-
-
springbatch配置为使用与JobRepository的业务逻辑相同的数据源
作为参考,您可以查看我创建了一个最小项目来重现问题的示例项目:
https://github.com/FlorianSW/spring-batch-connection-issue
问题是:
假设您有一个控制器,它处理一个RequestMapping,其中至少发生两件事:控制器对业务模型数据库模式执行任意操作(例如,从数据库保存或请求实体),然后通过调用JobLauncher#run启动Spring批处理作业。Spring批处理配置为使用池大小为1的ThreadPoolTaskExecutor异步运行任务。
如果请求映射是每秒只查询几次(大约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]以分派大量请求之后,我可以轻松地将fetch请求的数量增加到150,并且应用程序将处理这些请求而不会出现任何问题(如预期的那样)。其中,在增加池大小之前,许多请求都会超时。
我不确定这是否是一个bug或者是一个改进或者其他什么,我也不确定组件是否是文档或者类似的东西,但是,我的目的是:
或者,如果这是一个bug,因为请求处理期间使用的JDBC连接没有在合理的短时间内返回到池中?
[1]
for (i = 0; i <= 150; i++) {fetch('http://localhost:8080/api/jobs/' + i, {method: 'PUT'})}