Spring Boot 3.1集成MSSQL出现The statement is closed错误求助
问题描述
技术环境:Spring Boot 3.1、Gradle、JPA、MSSQL
开发会员注册逻辑时,使用JPA的save方法能正常将数据存入数据库,但持续抛出com.microsoft.sqlserver.jdbc.SQLServerException: The statement is closed错误日志,且保存操作完成后不会产生该错误。无论Repository是否显式声明save方法,都会出现此问题。
相关代码与配置
Controller
@PostMapping("/signup") public String signUp(@Valid ManagersDto dto, Model model) { MessageAndRedirectDto messageDto; Optional<Managers> result = managersService.joinMember(dto); if(result.isEmpty()){ messageDto = new MessageAndRedirectDto("Please wait a moment for approval.", "/", RequestMethod.GET, null); }else { messageDto = new MessageAndRedirectDto("The same ID already exists.", "/", RequestMethod.GET, null); } return messageAndRedirect.showMessageAndRedirect(messageDto, model); }
Service
public Optional<Managers> joinMember(ManagersDto managersDto) { managersDto.setPassword(passwordEncoder.encode(managersDto.getPassword())); managersDto.setTelNo(commUtil.replaceHyphen(managersDto.getTelNo())); managersDto.setPhoneNo(commUtil.replaceHyphen(managersDto.getPhoneNo())); managersDto.setRole(UserRole.USER); managersDto.setStatus(UserStatus.WAITING); Optional<Managers> check = validationDuplicateUser(managersDto.toEntity()); if(check.isEmpty()){ try{ managersRepository.save(managersDto.toEntity()); }catch (Exception e){ e.printStackTrace(); } } return check; }
Repository
@Repository public interface ManagersRepository extends JpaRepository<Managers, Long> { Optional<Managers> findByUserId(String userId); }
application.properties
spring.datasource.url=jdbc:log4jdbc:sqlserver://XXX.XXX.XX.XXX;databaseName=DBName;encrypt=true;trustServerCertificate=true spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy spring.datasource.username= spring.datasource.password= spring.jpa.database=sql_server spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.show_sql=true spring.jpa.open-in-view=false spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect logging.config=classpath:logback-spring.xml
build.gradle
implementation 'com.microsoft.sqlserver:mssql-jdbc:12.2.0.jre11' implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16' testImplementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.8'
问题分析与解决方案
这个错误的核心原因是log4jdbc与MSSQL JDBC驱动版本不兼容。log4jdbc作为JDBC代理驱动,在拦截SQL操作时,可能在Statement已被Hibernate关闭后仍尝试访问该资源,从而触发异常。以下是具体解决步骤:
升级log4jdbc版本
当前使用的log4jdbc-log4j2-jdbc4.1:1.16版本较旧,无法很好适配Spring Boot 3.1和MSSQL JDBC 12.2.0。建议升级到适配JDBC 4.2的版本:implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.2', version: '1.17'添加log4jdbc驱动加载配置
在application.properties中添加以下配置,避免log4jdbc自动加载可能冲突的驱动:spring.datasource.hikari.data-source-properties.log4jdbc.auto.load.popular.drivers=false调整Hibernate连接释放策略
确保事务结束后立即释放连接及相关Statement,避免log4jdbc访问已关闭的资源:spring.jpa.properties.hibernate.connection.release_mode=after_transaction临时排除log4jdbc验证问题
如果上述方案无效,可以临时移除log4jdbc依赖,改用原生MSSQL驱动验证:- 修改数据源配置:
spring.datasource.url=jdbc:sqlserver://XXX.XXX.XX.XXX;databaseName=DBName;encrypt=true;trustServerCertificate=true spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver - 移除build.gradle中的log4jdbc依赖。
若错误消失,则确认是log4jdbc兼容性问题,可考虑更换为p6spy等其他SQL日志工具。
- 修改数据源配置:
内容的提问来源于stack exchange,提问作者Kyuni
相关产品推荐
相关产品推荐

