使用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
相关产品推荐
相关产品推荐

