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

Java7 sqljdbc4-getConnection()上的SQL错误08S01,java,sql-server-2008,sqljdbc,Java,Sql Server 2008,Sqljdbc,我正在尝试编写一个非常简单的GUI应用程序来插入一些记录 并读回一些记录(没什么特别的,只有一个表,有3行,没有关系)。 来源 package EntryProg; import java.sql.*; import com.microsoft.sqlserver.jdbc.*; public class CourseDataEntryHandler { private Connection connect; private CallableStatement callSt

我正在尝试编写一个非常简单的GUI应用程序来插入一些记录 并读回一些记录(没什么特别的,只有一个表,有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

我已经验证了用户、密码、服务器名、端口和数据库名都是正确的。 如果我将用户名更改为无效用户名,我会收到一个“无法登录”错误报告,因此我知道我正在访问服务器

我还没有完全连接过一次,所以我知道这不是一个“连接太多”的问题,因为当前唯一登录服务器的人是我通过sql management studio。当我注销时,它也不起作用,所以肯定不是连接问题

应用程序用户还具有datareader/datawriter权限。 (如果有必要的话,我正在使用Eclipse,并且我正在引用sqljdbc4.jar库)

我不知道该去哪里解决这个问题。任何帮助都将不胜感激

编辑 更新-我还尝试了一个连接字符串,并使用DriverManager.getConnection(connString)来设置连接,但也没有成功。结果是一样的。 另外,SQLServer2008R2是我正在使用的SQLServer版本

编辑
我写了一个快速的C#程序来测试连接,当然连接在.net中运行良好,不幸的是我不得不使用java来完成这个项目(这是一个我自己为一个班级选择的项目,唯一的要求是它是java的……老师也不知道发生了什么)。

setEncrypt(true)
注释这行内容:

加密设置可能有问题。从文件中:

如果encrypt属性设置为true,则Microsoft SQL Server JDBC驱动程序将使用JVM的默认JSSE安全提供程序与SQL Server协商SSL加密。默认安全提供程序可能不支持成功协商SSL加密所需的所有功能。例如,默认安全提供程序可能不支持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服务器的数据库带来麻烦。你也可以

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

有时,发动机配置被修改为不接受外部连接。经过一些研究,以下几点对我起了作用:

  • 打开SQL Server配置管理器
  • 获取SQL SERVER网络配置
  • MSSQLSERVER协议(双击)
  • 查看TCP/IP(必须启用)(打开)
  • 转到“IP地址”选项卡
  • 键入“TCP端口”:1433
  • 启用和激活选项必须启用:是
  • 重新启动服务

  • 看起来我可能不得不对这一个进行悬赏>。由于安全原因,我连接到的SQL server实例将强制ssl,因此无法对其进行注释。cert是startcom的免费软件,因此RSA大小不应该是一个问题。我甚至遇到过不使用trustservercert和导入Java中使用所需的证书的麻烦(在那里大约3个小时的故障排除),但运气不佳。我最终得到了相同的08s01错误。然后,您应该尝试使用
    -djse.enableCBCProtection=false
    系统属性关闭JVM中SSL/TLS BEAST攻击的Oracle修复程序。请注意,它将影响VM内的所有SSL连接。该修复程序是从版本1.6.0_29和7.0.0_1开始添加的。附录:已知上述安全修复程序会给MSSQL服务器的数据库连接带来麻烦。例如,参见jTDS bug#3468079(),它也提到了Microsoft驱动程序。谢谢,我将尝试一下。如果它工作得很好,至少乍一看是这样的。不再只是断开连接。当然,现在调用存储过程来获取表中的所有行并不会返回结果集,但这是一个全新的调试过程。非常感谢。用和问题相同的语言回答是有意义的。@ChristianSolano欢迎使用堆栈溢出!谢谢你的第一个答案。然而,考虑到英语是网站的主要语言,如果你的文章是用这种语言写的,那么你的贡献对其他用户确实会更有帮助。请看一看。
    ...
    dSource.setDatabaseName(REDACTED);
    //dSource.setEncrypt(true);
    dSource.setTrustServerCertificate(true);
    ...