You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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关闭后仍尝试访问该资源,从而触发异常。以下是具体解决步骤:

  1. 升级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'
    
  2. 添加log4jdbc驱动加载配置
    在application.properties中添加以下配置,避免log4jdbc自动加载可能冲突的驱动:

    spring.datasource.hikari.data-source-properties.log4jdbc.auto.load.popular.drivers=false
    
  3. 调整Hibernate连接释放策略
    确保事务结束后立即释放连接及相关Statement,避免log4jdbc访问已关闭的资源:

    spring.jpa.properties.hibernate.connection.release_mode=after_transaction
    
  4. 临时排除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:34:53