java 无法为具有Spring Batch的事务打开JDBC

qqrboqgw  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(168)

对不起,我的英语很差,但我希望有人能帮助我。
我遇到了一个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连接是如何以及何时返回到池中的?

zkure5ic

zkure5ic1#

步骤中使用的数据库连接数取决于许多参数,包括步骤的类型(单线程或多线程),以及项目读取器的类型(例如jdbc游标项读取器打开单个连接,而jdbc分页项读取器打开每页的连接).您的问题中没有描述读取器的类型,如果没有错误的完整堆栈跟踪,就不可能知道问题的根本原因。
回答您的问题的最佳方法是启用org.springframework.jdbc包的调试日志。

相关问题