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

使用Spring Boot+JDK8连接SQL Server 2008报错:连接已关闭无法取数

解决JDK 1.8.371 + Spring Boot 2.1.5连接SQL Server 2008的无响应问题

问题背景

  • 环境:JDK 1.8.371、Spring Boot 2.1.5、MS SQL Server 2008
  • 错误提示:SQL Server did not return a response. The connection has been closed
  • 当前状态:修改java.security中jdk.tls.disabledAlgorithms=None后可建立连接,但执行查询无法获取数据

现有配置与代码

数据库配置

jdbcUrl: jdbc:sqlserver://IPAddress:1433;databaseName=MyDatabase;integratedSecurity=false;encrypt=true;trustServerCertificate=true;sslProtocol=TLSv1
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

Java代码

Class.forName(dbDriver);
try (Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword)) {
    try (PreparedStatement cStmt = conn.prepareCall(dbQuery)) {
        try (ResultSet dbSet = cStmt.executeQuery()) {
            while (dbSet.next()) {
                    TransId = dbSet.getString("TRANS_ID");
                }
            }
        }
    }

查询语句

Select TRANS_ID From Transactionlog;

解决方案

1. 降级JDBC驱动版本

SQL Server 2008对高版本JDBC驱动兼容性差,Spring Boot 2.1.5默认的mssql-jdbc版本过高,建议指定兼容版本:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>6.4.0.jre8</version>
</dependency>

2. 优化JDBC URL参数

补充兼容性参数,适配SQL Server 2008的特性:

jdbcUrl: jdbc:sqlserver://IPAddress:1433;databaseName=MyDatabase;integratedSecurity=false;encrypt=true;trustServerCertificate=true;sslProtocol=TLSv1;sendStringParametersAsUnicode=false;selectMethod=cursor
  • sendStringParametersAsUnicode=false:避免Unicode转换引发的兼容性问题
  • selectMethod=cursor:采用游标模式加载结果集,防止大结果集导致连接超时

3. 修正代码中的Statement使用错误

prepareCall用于调用存储过程,普通SQL查询需改用prepareStatement,同时补充异常日志排查问题:

Class.forName(dbDriver);
try (Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword)) {
    // 替换prepareCall为prepareStatement
    try (PreparedStatement cStmt = conn.prepareStatement(dbQuery)) {
        try (ResultSet dbSet = cStmt.executeQuery()) {
            while (dbSet.next()) {
                TransId = dbSet.getString("TRANS_ID");
                // 打印日志确认数据读取情况
                System.out.println("读取到TRANS_ID: " + TransId);
            }
        }
    }
} catch (Exception e) {
    // 输出异常堆栈,定位查询阶段错误
    e.printStackTrace();
}

4. 检查SQL Server端配置

  • 确认Transactionlog表存在,且当前数据库用户拥有SELECT权限
  • 查看SQL Server日志,排查查询执行时的后台错误
  • 确认SQL Server最大连接数未耗尽,调整查询超时时间设置

内容的提问来源于stack exchange,提问作者Vinay M Gandhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:25