我正在尝试编写一个非常简单的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编写的......老师也不知道发生了什么。)
答案 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)
(如上所述)-Djsse.enableCBCProtection=false
系统属性来关闭JVM中的Java修复程序。请注意,它将影响同一VM中的所有SSL连接。答案 1 :(得分:0)
有时,引擎配置会以不接受外部连接的方式进行修改。经过一些研究,以下内容对我有用: