当前位置: 首页 > 面试题库 >

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

聂涛
2023-03-14
问题内容

我正在尝试编写一个非常简单的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中…老师也不知道这是怎么回事)。


问题答案:

用以下行注释行setEncrypt(true)

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

您可能无法使用加密设置。从setEncrypt(…)文档中:

如果crypto属性设置为 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)(如上所述)
  • 或者,如果它是由MSSQL Server强制执行的,则可以通过设置-Djsse.enableCBCProtection=false系统属性来关闭JVM中的Java修复程序。请注意,它将影响同一VM内的所有SSL连接。


 类似资料:
  • 我正在运行以下SQL语法: 但不管用。我得到了这个错误: 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,了解第1行“DISTINCT >”Number of Employees“FROM Hours”附近使用的正确语法 你能告诉我我在哪里做错了吗?对不起,我对MySQL和数据库不熟悉。

  • 问题内容: 在一个Java项目中,我正在使用ojdbc6 jar 我第一次跑步,dataSource.getConnection()很快。通常第二次还可以。接下来的几次大约需要45秒。之后,需要花费几分钟。一旦运行了给定应用程序的FIRST连接,我得到的任何新连接都将非常快速。对于给定的运行,此延迟仅获得FIRST连接。 是什么让我的第一次连接如此缓慢? 我正在看netstat,成功运行后看不到任

  • 问题内容: 我有一个似乎容易实现的目标,但是我没有找到一个好的解决方案。Google对此没有透露任何信息,我只是希望我一直在错误的地方寻找解决方案,或者只是试图以错误的方式使用工具… 也许今天对我来说想清楚已经太晚了:)但是,我希望这是您可以帮助我的地方。 我只需要能够记录在SQL Server的特定实例上执行的错误查询。我以为SQL Profiler可以让我立即执行此操作,但我无法找到允许我仅记

  • 问题内容: 我在Access DB的VB应用程序中有此查询: 它给出了我无法解决的以下问题… “查询表达式’ISNULL(a.faultCount,0’)中的函数使用的参数数量错误。” 我要实现的只是将值设置为零,这意味着在特定区域中没有故障。 谢谢你 问题答案: 我想补充我的两分钱,而我喜欢NZ()的简单的语法,如果你寻求无故障性能,既ISNULL()和新西兰()应该有利于为NULL来避免: 。

  • 下面是命令table exists,file exists on server: 谢谢你托马斯

  • 我犯了错误: 有人有什么想法吗?多谢!