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

时间:2012-01-24 14:57:08

标签: java sql-server-2008 sqljdbc

我正在尝试编写一个非常简单的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

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

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

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

我不知道在哪里进行故障排除。任何帮助将不胜感激。

修改的 更新 - 我还尝试了一个连接字符串,并使用DriverManager.getConnection(connString)来设置连接,这也没有用。结果是一样的。 另外,SQL server 2008 r2是我正在使用的sql server版本。

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

2 个答案:

答案 0 :(得分:15)

使用setEncrypt(true)评论该行:

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

您可能无法使用加密设置。来自setEncrypt(...)文档:

  

如果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 Server的连接出现问题。你可以

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

答案 1 :(得分:0)

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

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