我已经通过 SQL Server 2008 R2 安装设置了实例 SQLEXPRESS,添加了一个具有所有服务器角色的安全登录,一个称为“sqluser”。
每当我尝试连接连接时都会遇到异常。连接字符串是从以下内容构建的:
<db.driverClassName>com.microsoft.sqlserver.jdbc.SQLServerDriver</db.driverClassName>
<database.username>sqluser</database.username>
<database.password>qwerty</database.password>
<database.schemaname>dbo</database.schemaname>
<database.url>jdbc:sqlserver://localhost\SQLEXPRESS</database.url>
但是连接面临这个堆栈跟踪根本原因:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The connection to the host localhost, named instance sqlexpress failed. Error: "java.net.SocketTimeoutException: Receive timed out". Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434. For SQL Server 2005 or later, verify that the SQL Server Browser Service is running on the host.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.getInstancePort(SQLServerConnection.java:3589)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.primaryPermissionCheck(SQLServerConnection.java:1225)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:972)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
... 71 more
服务器身份验证为 SQL Server 和 Windows 身份验证模式。但是,当我指定 -S 属性时,登录失败。
没有启用防火墙,SQL 服务器甚至接受来自远程主机的连接。
C:\Users\user>sqlcmd -U sqluser -P qwerty -Q "Select * FROM testdb.dbo.testtable"
输出:
integer
-------
1
2
3
4
(4 rows affected)
但是,当指定“本地主机”时,查询失败......问题是为什么?
C:\Users\user>sqlcmd -S localhost/sqlexpress -U cpt -P 1234 -Q "Select * FROM cpt.dbo.testme"
输出:
HResult 0x43, Level 16, State 1
Named Pipes Provider: Could not open a connection to SQL Server [67].
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : A network-related or in stance-specific error .....
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : Login timeout expired.
如果有人想知道,用 '%COMPUTERNAME' 更改 'localhost' 是相同的结果。服务器作为 LocalSystem 实例运行。
编辑 给喇嘛分配答案,虽然它主要是提示:)这是我对这个问题的解决方案:
1) 检查 tcp ip 所有侦听器端口是否设置为 1434 2) 检查连接字符串是否正确设置 (database.url) 3) 检查登录是否有足够的访问权限(与此特定堆栈跟踪无关)