Java7 sqljdbc4-getConnection()上的SQL错误08S01
我正在尝试编写一个非常简单的GUI应用程序来插入一些记录 并读回一些记录(没什么特别的,只有一个表,有3行,没有关系)。 来源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
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
- 通过不使用
决定不使用加密(如上所述)setEncrypt(true)
- 或者,如果它是由MSSQL服务器强制执行的,您可以通过设置
系统属性来关闭JVM中的Java修复程序。请注意,它将影响同一VM内的所有SSL连接-djse.enableCBCProtection=false
看起来我可能不得不对这一个进行悬赏>。由于安全原因,我连接到的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);
...