簡體   English   中英

無法建立與SQL Server的多個JDBC連接

[英]Can't make multiple JDBC connections to SQL Server

我正在嘗試在本地SQL Server上進行一些純SQL查詢的負載測試(我不確定這是否是測試性能的最佳方法,但這會給我一個粗略的估計)。 我將Java的PreparedStatement和MS JDBC用於SQL Server,並實例化了一百個線程,每個線程中都有一個新的Connection

我已經安裝了SQL Server Express版本(11.0.210)。 不幸的是,Express版不會像Pro版一樣並行運行多個查詢,所以我的測試不會很有用。

一位同事告訴我,我可以使用SQL Developer2014。我在設置它時遇到了一些困難,因此我可能忘記了一些東西。 我開始通過sysadmin(sa)帳戶使用它。

與JDBC建立單個Connection並進行查詢按預期工作。


現在,我正在嘗試創建兩個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

我已經找到了有關此問題的答案,但是對於大多數問題來說,它們都是關於單個連接無法正常工作的。

在這里,當我嘗試與同一用戶進行2個或更多連接時,會出現問題,因此我排除了“ TCP not enabled”和“ Firewall block sql server”問題。

SQL Developer版本為:

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 Express上進行多次相同的連接,所以我相信這是SQL Server的配置問題,但是找不到任何相關的問題。

我在某處錯過了什么嗎? 有沒有辦法得到更明確的錯誤?

實際上,錯誤日志中存在更詳細的錯誤:

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->屬性->數據庫設置的“數據庫默認位置”下,右鍵單擊“日志:path / to / your / logs /”。

環顧四周后,找不到如何與sysadmin用戶建立多重連接,感覺這是不可能的(即使我使用的是SQL Server Express版,也可能配置方式不同或“ sa”用戶配置不正確)真正的系統管理員,或單線程阻止了實際上打開多個連接的事實)。

作為解決方案,我將嘗試使用戶的身份不同於sysadmin。

如果最終遇到非sysadmin類用戶的問題,請嘗試使用sp_configure'user connections',0 ;如果原始錯誤帶有單個連接, 請檢查是否啟用了TCP

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM