繁体   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