9

我正在尝试编写一个非常简单的 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 management studio。当我注销时它也不起作用,所以绝对不是连接问题。

应用程序用户也具有数据读取器/数据写入器权限。(如果这很重要,我正在使用 Eclipse。并且正在引用 sqljdbc4.jar 库)。

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

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

编辑 我写了一个快速的C#程序来测试连接,果然连接在.net中工作正常,不幸的是我必须为这个项目使用java(这是我选择自己为一个班级做的一个项目,只有要求是在Java中吗...老师也不知道发生了什么)。

4

2 回答 2

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

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

  • 使用不同的 JVM

更新

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

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

有时,引擎配置被修改为不接受外部连接。经过一些研究,以下内容对我有用:

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