对不起,我的英语很差,但我希望有人能帮助我。
我遇到了一个Could not open JDBC for transaction
错误,该错误是由使用SpringBatch的org.springframework.jdbc.datasource.DataSourceTransactionManager
引起的。
我在xml中定义了一个作业,如下所示
<batch:job id="chunkJob" job-repository="jobRepository">
<batch:step id="chunkJob.step01">
<batch:tasklet transaction-manager="jobTransactionManager">
<batch:chunk reader="reader1"
processor="processor1"
writer="writer1"
commit-interval="1" />
</batch:tasklet>
</batch:step>
<batch:step id="chunkJob.step02">
<batch:tasklet transaction-manager="jobTransactionManager">
<batch:chunk reader="reader2"
processor="processor2"
writer="writer2"
commit-interval="1" />
</batch:tasklet>
</batch:step>
<batch:step id="chunkJob.step03">
<batch:tasklet transaction-manager="jobTransactionManager">
<batch:chunk reader="reader3"
processor="processor3"
writer="writer3"
commit-interval="1" />
</batch:tasklet>
</batch:step>
</batch:job>
Java进程一直在运行,直到我按自己的意愿关闭它,当我触发它运行时,作业才运行,并且我设置它使用多个Java线程同时运行多个作业。jobTransactionManager
正在使用org.apache.commons.dbcp2.BasicDataSource
,数据库为postgresql,池的最大连接集数为10
。
当4个作业同时运行时出现错误,但错误不会在每次4个作业一起运行时重现。我希望每次批处理步骤完成(提交或回滚)时都会返回jdbc-connection,因此1个作业使用的连接数是1,但由于出现了此错误,我有点困惑。
有谁能帮我理解JDBC连接是如何以及何时返回到池中的?
1条答案
按热度按时间zkure5ic1#
步骤中使用的数据库连接数取决于许多参数,包括步骤的类型(单线程或多线程),以及项目读取器的类型(例如jdbc游标项读取器打开单个连接,而jdbc分页项读取器打开每页的连接).您的问题中没有描述读取器的类型,如果没有错误的完整堆栈跟踪,就不可能知道问题的根本原因。
回答您的问题的最佳方法是启用
org.springframework.jdbc
包的调试日志。