Java 无法连接到sql server 2008实例

Java 无法连接到sql server 2008实例,java,database,sql-server-2008,hibernate,jdbc,Java,Database,Sql Server 2008,Hibernate,Jdbc,我已经通过SQLServer2008R2安装安装了实例SQLEXPRESS,添加了一个具有所有服务器角色的安全登录名,一个名为“sqluser” 每当我尝试池连接时都会遇到异常。。正在从以下内容生成连接字符串: <db.driverClassName>com.microsoft.sqlserver.jdbc.SQLServerDriver</db.driverClassName> <database.username>sqluser</database.

我已经通过SQLServer2008R2安装安装了实例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>
服务器身份验证采用SQL server和Windows身份验证模式。但是,当我指定-S属性时,登录失败

没有启用防火墙,SQL server甚至接受来自远程主机的连接

C:\Users\user>sqlcmd -U sqluser -P qwerty -Q "Select * FROM testdb.dbo.testtable"
输出:

integer
-------
      1
      2
      3
      4

(4 rows affected)
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.
但是,当指定“localhost”时,查询失败。。。问题是为什么

C:\Users\user>sqlcmd -S localhost/sqlexpress -U cpt -P 1234 -Q "Select * FROM cpt.dbo.testme"
输出:

integer
-------
      1
      2
      3
      4

(4 rows affected)
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.
如果有人想知道,将“localhost”更改为“%COMPUTERNAME”也是同样的结果。服务器正在作为本地系统实例运行

编辑 给喇嘛分配答案虽然主要是暗示:)以下是我对这个问题的解决方案:

1) 检查tcp ip所有侦听器端口是否设置为1434 2) 检查连接字符串是否正确设置(database.url) 3) 检查登录是否有足够的访问权限(与此特定stacktrace无关)

尝试:

C:\Users\user>sqlcmd -S 192.168.01\sqlexpress
    -U cpt -P 1234 -Q "Select * FROM cpt.dbo.testme"

检查:如果超级存储库正在本地主机上运行,则检查SQL Server日志。如果没有,请启动配置。

我们是否可以确定唯一的问题是“本地主机”在这里

您可以使用斜杠以正确的方式尝试sqlcmd,并使用正确的登录名(如本文前面所述),看看它是否有效:

sqlcmd -S localhost\sqlexpress -U sqluser -P qwerty -Q "Select * FROM cpt.dbo.testme"
您提到它接受来自远程主机的命令,但是您的示例命令行没有指定要连接到的服务器,因此它不可能从远程主机运行


jdbc代码是否与SQL Server在同一台机器上运行?这将告诉我们是否可以从分析中排除防火墙。

我已修复此问题,不记得是主机/实例之间的/还是tcp/ip未侦听。以下是用于创建登录名、数据库和正确设置SQL服务的脚本命令:

将设置混合身份验证并打开tcpport 1433的批处理作业:

echo off
rem is sql server installed at this build number?
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS" >nul
if %errorlevel% EQU 0 (
echo SET : SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\Enabled : True
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\"&_
 "MSSQL10_50.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp" /v Enabled /t REG_DWORD /d 0x1 /f
echo SET : SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\ListenOnAllIPs : True
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\"&_
  "MSSQL10_50.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp" /v ListenOnAllIPs /t REG_DWORD /d 0x1 /f
echo SET : SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\IPAll\TcpPort : 1433
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\"&_
  "MSSQL10_50.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\IPAll" /v TcpPort /d 1433 /f
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer" /t REG_DWORD /v LoginMode /d 2 /f
)
将创建登录名并设置混合身份验证的SQL脚本

CREATE DATABASE dbnamehere;
GO
USE [master]
GO
CREATE LOGIN [usernamehere] WITH PASSWORD=N'1234', DEFAULT_DATABASE=[dbnamehere], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
EXEC master..sp_addsrvrolemember @loginame = N'usernamehere', @rolename = N'bulkadmin'
GO
EXEC master..sp_addsrvrolemember @loginame = N'usernamehere', @rolename = N'dbcreator'
GO
EXEC master..sp_addsrvrolemember @loginame = N'usernamehere', @rolename = N'diskadmin'
GO
EXEC master..sp_addsrvrolemember @loginame = N'usernamehere', @rolename = N'processadmin'
GO
EXEC master..sp_addsrvrolemember @loginame = N'usernamehere', @rolename = N'securityadmin'
GO
EXEC master..sp_addsrvrolemember @loginame = N'usernamehere', @rolename = N'serveradmin'
GO
EXEC master..sp_addsrvrolemember @loginame = N'usernamehere', @rolename = N'setupadmin'
GO
EXEC master..sp_addsrvrolemember @loginame = N'usernamehere', @rolename = N'sysadmin'
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2
GO
最后,断言机器重新启动时正在运行正确的服务

@echo off
sc config "MSSQL$SQLEXPRESS"  start= auto
sc failure "MSSQL$SQLEXPRESS"  actions= restart/180000/restart/180000/""/180000 reset= 86400
sc config "SQLBrowser"  start= auto
sc failure "SQLBrowser"  actions= restart/180000/restart/180000/""/180000 reset= 86400
net stop MSSQL$SQLEXPRESS
net start MSSQL$SQLEXPRESS
sc config "SQLBrowser"  depend= "MSSQL$SQLEXPRESS"
net stop SQLBrowser
net start SQLBrowser

检查此链接,了解jdbc url格式连接字符串是否正常工作,以及有关“”的建议;instanceName=SQLEXPRESS'不会更改任何内容。我们使用Hibernate连接,回到这里;想知道反斜杠滑入dos的位置。这甚至不是一个有效的IP地址,即使是,也不能假定它是SQL Server的IP地址。有意义-sqlcmd.exe使用反斜杠连接和处理SQL!剩下的唯一一件事就是HibernateJDBC是如何失败的。已知良好的连接字符串如何从工具链的一个安装更改为另一个安装?sql server和bean factory都是本地主机。连接是通过一个servlet容器建立的,该容器在其构造链中失败,这是因为试图从sqlexpress instanceI收集的配置变量来自上面的SQLCMD工作的响应?所以当您使用servlet/JDBC时会出现超时错误?有没有其他工具可以用来测试JDBC(并去掉servlet?)可以使用这个utils.dbping工具吗?(对不起,我对Java不太了解)你是说它是配置代码吗?您是否可以转储连接代码正在使用的配置,并验证它是否使用了正确(预期)的JDBC连接字符串?还要注意,名称“schema”可能在不同的数据库平台上不明确。在SQL中,更重要的是指定数据库而不是模式。不过,JDBC可能会将SQL数据库称为模式-不确定。无论如何,这不会导致超时错误-所以现在不要担心它。