2017-11-08 20 views
0

ローカルSQL Server上にいくつかの純粋なSQLクエリをテストしようとしています(これはパフォーマンスをテストする最良の方法ではないでしょうが、大まかな見積もり)。私はJavaのPreparedStatementとMS JDBCをSQL Server用に使用していますが、それぞれConnectionの100スレッドをインスタンス化します。複数のJDBC接続をSQL Serverに作成できません

SQL Server Expressエディション(11.0.210)が既にインストールされていました。残念ながら、Express Editionは複数のクエリを並列に実行することはありません(Pro版と同様)ので、私のテストはあまり役に立ちません。

私はSQL Developer 2014を使用することができますが、私はいくつかの設定が難しいため、何かを忘れてしまった可能性があります。私はsysadmin(sa)アカウントでそれを使用し始めました。

ConnectionをJDBCで1つ作成し、クエリを期待どおりに実行します。

今、私は2つの Connectionを作成しようとしている

String SQLSERVER_CONNECTION_STRING = "jdbc:sqlserver://localhost\\SQLDEVELOPPER:55372"; 
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
Connection c1 = DriverManager.getConnection(SQLSERVER_CONNECTION_STRING, USER, USER_PWD); 
Connection c2 = DriverManager.getConnection(SQLSERVER_CONNECTION_STRING, USER, USER_PWD); 

まず私はstderrにこのメッセージが表示されます。

nov. 08, 2017 10:41:00 AM com.microsoft.sqlserver.jdbc.SQLServerConnection Prelogin 
AVERTISSEMENT: ConnectionID:1 ClientConnectionId: bfb1d22d-a5fb-4f74-9be8-60fb91c9d701 Prelogin error: host localhost port 55372 Error reading prelogin response: Software caused connection abort: recv failed ClientConnectionId:bfb1d22d-a5fb-4f74-9be8-60fb91c9d701 

そして、このエラーを16回取得:

nov. 08, 2017 10:41:01 AM com.microsoft.sqlserver.jdbc.SQLServerConnection Prelogin 
AVERTISSEMENT: ConnectionID:1 ClientConnectionId: fcd64c62-ba9a-48ee-b195-11307e7bad30 Prelogin error: host localhost port 55372 Error reading prelogin response: Une connexion existante a dû être fermée par l’hôte distant ClientConnectionId:fcd64c62-ba9a-48ee-b195-11307e7bad30 

翻訳: "既存の接続は遠隔ホストによって閉じられなければなりませんでした"(私は最初の "遠いホストによって既存の接続が閉鎖されているかもしれませんが、@ fabのコメントが指摘する通り、それは間違っているかもしれません)

は、このスタックトレース:

Exception in thread "main" java.lang.RuntimeException: com.microsoft.sqlserver.jdbc.SQLServerException: Une connexion existante a dû être fermée par l’hôte distant ClientConnectionId:0fa4b1cb-ae03-407a-bcc3-54a0cd85005c 
    at fr.aso.sandbox.utils.SQLServerConnectionManager.getConnection(SQLServerConnectionManager.java:24) 
    at fr.aso.sandbox.myComp.myComp.test.KeycopterTest.doubleConnectionThreadTest(KeycopterTest.java:78) 
    at fr.aso.sandbox.myComp.myComp.test.KeycopterTest.main(KeycopterTest.java:49) 
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Une connexion existante a dû être fermée par l’hôte distant ClientConnectionId:0fa4b1cb-ae03-407a-bcc3-54a0cd85005c 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2397) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2384) 
    at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1884) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.Prelogin(SQLServerConnection.java:2137) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1973) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1628) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1459) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:773) 
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1168) 
    at java.sql.DriverManager.getConnection(DriverManager.java:664) 
    at java.sql.DriverManager.getConnection(DriverManager.java:247) 
    at fr.aso.sandbox.utils.SQLServerConnectionManager.getConnection(SQLServerConnectionManager.java:22) 
    ... 2 more 

私はこれについてSO質問と回答を見つけましたが、それらのほとんどのために働いていない単一の接続についてだったしました。

ここでは、同じユーザーと2つ以上の接続を試したときに問題が発生するため、「TCPが有効になっていません」と「ファイアウォールブロックSQL Server」の問題が排除されています。

SQL Developerバージョンがある:私は、複数の時間にSQL Expressの上で同じ接続を行う可能性があるため

Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) 
    Jun 17 2016 19:14:09 
    Copyright (c) Microsoft Corporation 
    Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

、私はこれは、SQL Serverの設定の問題であると考えていますが、関連する何かを見つけることができませんでした。

私はどこかに恋をしましたか?もっと明示的なエラーを出す方法はありますか?

+0

エラーを理解することが重要になる可能性があるので(私が間違っていると私を修正する)、翻訳は "既存の接続*を遠方のホストによって閉じなければなりませんでした"と信じています – fab

+0

@fabありがとう!私はあなたが正しいと思う、私は質問を編集しました。 – Asoub

答えて

0

実際には、エラー・ログでより詳細なエラーが発生しました:

2017-11-09 18:13:01.85 Logon  Error: 17810, Severity: 20, State: 2. 
2017-11-09 18:13:01.85 Logon  Could not connect because the maximum number of '1' dedicated administrator connections already exists. Before a new connection can be made, the existing dedicated administrator connection must be dropped, either by logging off or ending the process. [CLIENT: 127.0.0.1] 

あなたがどこにあるかわからない場合データベースのエラーログを右クリックしてSSMS - >プロパティ - >データベースsデータベースのデフォルトの場所 の下にある "ログ:path/to/your/logs /"を参照してください。

sysadminユーザーと複数の接続を確立する方法が見つからない場合は、SQL Server Expressエディションで行った場合でも、同じことができないか、ユーザーは実際にはsysadminではなく、単一のスレッドで複数の接続を実際に開くことができないという事実でした)。

解決策として、私は、システム管理者のようなものではないユーザーを作ろうとします。

システム管理者以外のユーザーtry using sp_configure 'user connections', 0に問題が発生し、元のエラーが1つの接続である場合はcheck if TCP is enabledとなります。

関連する問題