Java7 sqljdbc4 – getConnection()上的SQL错误08S01

我正在尝试编写一个非常简单的GUI应用程序,用于将一些记录插入数据库,并回读一些记录(没什么特别的,只有1个表有3行,没有关系)。 来源…

package EntryProg; import java.sql.*; import com.microsoft.sqlserver.jdbc.*; public class CourseDataEntryHandler { private Connection connect; private CallableStatement callState; private ResultSet rSet; private SQLServerDataSource dSource; public CourseDataEntryHandler() { rSet = null; callState = null; dSource = new SQLServerDataSource(); dSource.setUser(REDACTED); dSource.setPassword(REDACTED); dSource.setServerName(REDACTED); dSource.setPortNumber(REDACTED); dSource.setDatabaseName(REDACTED); dSource.setEncrypt(true); dSource.setTrustServerCertificate(true); try { 

这里错了

  connect = dSource.getConnection(); 

结束错误

  } catch (SQLServerException e) { //TODO Figure out how to handle -- logging for now, console do { System.out.println(e.getErrorCode()); System.out.println(e.getMessage()); System.out.println(e.getSQLState()); e = (SQLServerException) e.getNextException(); } while (e != null); System.out.println("END"); System.out.println(); } } 

我收到以下错误…

(代码)0

(消息)SQL Server未返回响应。 连接已关闭。

(状态)08S01

我已经validation用户,通行证,服务器名称,端口和数据库名称都是准确的。 如果我将用户名更改为无效用户名,我会收到“无法登录”错误报告,因此我知道我正在点击服务器。

我无法完全连接一次,因此我知道这不是“太多连接”问题,因为当前登录服务器的唯一人是我通过sql管理工作室。 当我退出时,它不起作用,所以绝对不是连接#问题。

应用程序用户也具有datareader / datawriter权限。 (我正在使用Eclipse,如果这很重要。我正在引用sqljdbc4.jar库)。

我对在何处进行故障排除感到茫然。 任何帮助将不胜感激。

编辑更新 – 我也尝试了一个连接字符串并使用DriverManager.getConnection(connString)来设置连接,这也不起作用。 结果是一样的。 此外,SQL Server 2008 r2是我正在使用的sql server版本。

编辑我写了一个快速的C#程序来测试连接,确实连接在.net中工作得很好,不幸的是我必须在这个项目中使用java(这是我自己选择为一个类做的项目,只需要它是Java吗?老师也不知道发生了什么。

setEncrypt(true)注释该行:

 ... dSource.setDatabaseName(REDACTED); //dSource.setEncrypt(true); dSource.setTrustServerCertificate(true); ... 

您可能在加密设置方面遇到问题。 从setEncrypt(…)文档:

如果encrypt属性设置为true ,则Microsoft SQL Server JDBC驱动程序使用JVM的默认JSSE安全提供程序与SQL Server协商SSL加密。 默认安全提供程序可能不支持成功协商SSL加密所需的所有function。 例如,默认安全提供程序可能不支持SQL Server SSL证书中使用的RSA公钥的大小。 在这种情况下,默认安全提供程序可能会引发错误,导致JDBC驱动程序终止连接。 要解决此问题,请执行以下操作之一:

  • 使用具有较小RSA公钥的服务器证书配置SQL Server

  • 配置JVM以在“/lib/security/java.security”安全属性文件中使用不同的JSSE安全提供程序

  • 使用不同的JVM

更新

在Java版本1.6.0_29和7.0.0_1中,Oracle为SSL / TLS BEAST攻击引入了一个安全修复程序,很可能会导致同样的问题。 已知上述安全修复程序会因使用jTDS驱动程序和Microsoft驱动程序而导致与MSSQL Server的数据库连接出现问题。 你也可以

  • 不使用setEncrypt(true)决定不使用加密(如上所述)
  • 或者,如果由MSSQL Server强制执行,则可以通过设置-Djsse.enableCBCProtection=false系统属性来关闭JVM中的Java修复程序。 请注意,它将影响同一VM中的所有SSL连接。

有时,引擎配置会以不接受外部连接的方式进行修改。 经过一些研究,以下内容对我有用:

  1. 打开SQL Server配置管理器
  2. 转到SQL SERVER网络配置
  3. MSSQLSERVER协议(双击)
  4. 查看TCP / IP(必须启用)(打开)
  5. 转到“IP地址”选项卡
  6. 输入“TCP端口”:1433
  7. 必须启用已启用和已激活的选项:是
  8. 重启服务