MS SQL Server和JDBC:连接关闭

9

在使用Java代码从MS SQL Server 2008连接时,出现以下错误:

I/O Error:DB服务器关闭连接。

SQL Server处于混合模式,且位于本地计算机上。我的连接字符串是jTDS

jdbc:jtds:sqlserver://machineName:1433;databaseName=DB;integratedSecurity=true

堆栈跟踪如下:

java.sql.SQLException: I/O Error: DB服务器关闭连接。 at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2311) at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:610) at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:345) at net.sourceforge.jtds.jdbc.ConnectionJDBC3.(ConnectionJDBC3.java:50) at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at com.app.hibernate.test.(test.java:22) at com.app.hibernate.test.main(test.java:53) Caused by: java.io.IOException: DB服务器关闭连接。 at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:848) at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:727) at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:466) at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:103) at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2206) ... 8 more Exception in thread "main" java.lang.NullPointerException at com.app.hibernate.test.db(test.java:36) at com.app.hibernate.test.main(test.java:54)

JDBC驱动程序:

String url ="jdbc:sqlserver://machine:1433;instance=SQLEXPRESS;databaseName=db";

堆栈跟踪如下:

com.microsoft.sqlserver.jdbc.SQLServerException: 用户名 'username' 登录失败。 在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:156) 在 com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:240) 在 com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:78) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2636) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2046) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:2034) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4003) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1550) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1207) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(SQLServerConnection.java:1054) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:758) 在 com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842) 在 java.sql.DriverManager.getConnection(Unknown Source) 在 java.sql.DriverManager.getConnection(Unknown Source) 在 com.app.hibernate.test.(test.java:22) 在 com.app.hibernate.test.main(test.java:53) 程序中出现异常 "main" java.lang.NullPointerException 在 com.app.hibernate.test.db(test.java:36) 在 com.app.hibernate.test.main(test.java:54)

1
你能在这里粘贴堆栈跟踪吗? - Adil Shaikh
1
可能是服务器配置问题... - hovanessyan
可能是服务器配置问题。 - Mukthi
1
这是一个远程服务器吗?如果是的话,服务器可能被配置为不允许远程连接。此外,数据库用户权限呢? - hovanessyan
2
尝试使用 SQL Server 的 JDBC 驱动程序,而不是 jTDS。此外,您需要更改 SQL 连接的 URL。特别是,用户名需要采用以下格式 user@[instanceID]。 - Adil Shaikh
显示剩余4条评论
3个回答

4

您的连接字符串和身份验证存在错误。如果是混合模式,请不要使用SQL身份验证

请尝试以下内容

PC名称 : janaka-pc SQL用户名 : sa SQL密码
: 1234 数据库 : Janak_DB

JDBC中用于SQL连接的代码

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection("jdbc:sqlserver://janaka-PC;user=sa;password=1234;database=Janak_DB");


2

您的连接字符串存在问题

对于jTDS:

jdbc:jtds:sqlserver://machineName:1433;databaseName=DB;useNTLMv2=true;domain=workgroup

您可以查看http://jtds.sourceforge.net/faq.html#windowsAuth获取所需的单点登录库,以使NTLM正常工作。

在使用JDBC驱动程序时,您提供给jdts的“integratedSecurity=true”是有效的

jdbc:sqlserver://machine:1433;instance=SQLEXPRESS;databaseName=db;integratedSecurity=true


我同时使用了URL,但在SQL Server驱动程序中出现了“无法打开由登录请求的数据库“DB”。登录失败。”的错误。而在jtds中则出现了“USENTLMV2连接属性无效”的错误。 - Mukthi
如果我设置 useNTLMv2=false,那么我会得到相同的登录失败错误。 - Mukthi
但是我可以访问数据库中的系统表。 - Mukthi
对于jdts情况,您是否安装(复制)了ntmlauth.dll文件?您可以在readme.sso中阅读有关此的信息。 - Serkan Arıkuşu
据我所知,有两个选择:1)dll文件不在PATH环境变量引用的目录中(希望您确定PATH包含jre dir);2)您的服务器不支持ntlmV2;在这种情况下,您可以尝试使用**jdbc:jtds:sqlserver://machineName:1433;databaseName=DB;**作为连接字符串,删除useNTLMv2参数。 - Serkan Arıkuşu

0

在 MS SQL 方面出现了身份验证错误。

如果您无法控制如何获取连接(例如,您正在使用数据源或连接池),则连接 URL 必须包含要使用的登录名和密码,例如:

jdbc:sqlserver://machine:1433;instance=SQLEXPRESS;databaseName=db;user=USERNAME;password=PASSWORD";

如果应用程序正在运行在 Windows 机器上,并且您想要使用已登录用户的凭据,则可以指定带或不带 useNTLMv2domain 参数。

最后,如果您在 Windows 机器上但想要对用户进行域身份验证,则必须提供用户名、密码和域参数。您可以在 jtds FAQ 中了解所有相关信息,特别是 URL Format 部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接