0

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)

ただし、「localhost」を指定すると、クエリは失敗します...質問はなぜですか?

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 インスタンスとして実行されています。

edit それは主にヒントでしたが、ラマに答えを割り当てます:) これが問題に対する私の解決策です:

1) tcp ip all listener port が 1434 に設定されていることを確認します 2) 接続文字列が適切に設定されていることを確認します (database.url) 3) ログインに十分なアクセス権があることを確認します (この特定のスタックトレースとは関係ありません)

4

3 に答える 3

1

ここで唯一の問題は「localhost」だけであると確信していますか?

インまたはアウトを判断するために、正しい方法でスラッシュを使用して sqlcmd を試し、正しいログイン (投稿の前半で説明したように) が機能するかどうかを確認できます。

sqlcmd -S localhost\sqlexpress -U sqluser -P qwerty -Q "Select * FROM cpt.dbo.testme"

リモートホストからのコマンドを受け入れると述べていますが、コマンドラインの例では接続先のサーバーが指定されていないため、リモートホストから実行されている可能性はありません。

jdbc コードは SQL Server と同じマシンで実行されていますか? これにより、分析からファイアウォールを除外できるかどうかがわかります。

于 2012-11-11T14:44:43.590 に答える
-1

試す:

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

チェック:SQL-Server-SuperSocketがローカルホストで実行されているかどうかをログに記録します。そうでない場合は、構成を開始します。

于 2012-11-11T13:24:14.203 に答える