升级Spring Batch 5.1.0后Session/EntityManager及EntityManagerFactory关闭问题求助
核心排查方向
事务边界配置问题
开发环境与本地的事务配置可能存在差异,需检查NdmisPerformanceReportJobConfiguration中的批处理步骤:确保所有数据库读写操作都处于Spring Batch的事务上下文内。如果自定义了ItemReader/ItemProcessor/ItemWriter,排查是否存在手动调用EntityManager.close()的代码,或操作脱离了事务管理导致Session提前关闭。数据源连接池配置差异
开发环境的连接池(如HikariCP)可能设置了更严格的超时参数,比如idleTimeout、maxLifetime值过小,导致批处理运行中数据库连接被回收。对比本地与开发环境的数据源配置,确保批处理的执行时长在连接存活周期内。Spring Batch与Hibernate上下文同步问题
升级后需确认事务管理器配置是否正确:使用JPA+Hibernate时,应配置JpaTransactionManager而非DataSourceTransactionManager,保证批处理事务由JPA管理器托管,避免EntityManager被意外关闭。定时任务上下文生命周期问题
开发环境的CronJob可能运行在独立上下文,或任务执行完成后上下文被提前销毁。检查定时任务的TaskExecutor配置,确保任务执行期间Spring上下文保持活跃,防止EntityManagerFactory被提前关闭。
调试与验证步骤
添加细粒度日志
在EntityManager获取、数据库操作前后添加日志,打印Session状态与当前事务信息;开启Hibernate的org.hibernate日志级别为DEBUG,跟踪Session的创建、关闭时机,定位触发Session关闭的具体操作。复用开发环境配置本地复现
将本地环境的配置文件替换为开发环境的版本(含数据源、连接池、Spring Batch配置),尝试复现问题,便于本地调试定位根因。检查数据库权限
验证开发环境中Spring Batch元数据表(如BATCH_JOB_INSTANCE、BATCH_STEP_EXECUTION等)的数据库用户权限,确保拥有完整的读写权限——权限不足可能导致任务状态保存失败,进而引发EntityManagerFactory异常。确认版本兼容性与升级完整性
核对Spring Boot与Spring Batch的版本匹配关系(如Spring Boot 3.x对应Spring Batch 5.x),检查是否遗漏升级指南中的步骤:比如已变更的配置属性、需新增的BatchConfigurer等Bean是否正确配置。
内容的提问来源于stack exchange,提问作者Andrew Hodgson

