无法与SQL Server建立多个JDBC连接

时间:2017-11-08 10:10:23

标签: java sql-server jdbc

我试图在我的本地SQL Server上加载测试一些纯SQL查询(我不确定这是测试性能的最佳方法,但这会给我一个粗略的估计)。我正在使用Java的PreparedStatement和MS JDBC for SQL Server,我在每个线程中使用新的Connection实现一百个线程。

我已经安装了SQL Server Express版本(11.0.210)。不幸的是,Express版本不会同时运行多个查询(Pro版本也是如此),所以我的测试不是很有用。

一位同事告诉我,我可以使用SQL Developer 2014.我在设置它时遇到了一些困难,所以我可能已经忘记了一些事情。我开始在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

已翻译:"现有连接必须由远程主机关闭" (我先把它读作"现有的连接可能已经被远程主机关闭了#34;但是@ 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"和#34;防火墙阻止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配置问题,但无法找到任何相关内容。

我在某处遗漏了什么吗?有没有办法获得更明确的错误?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分: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中右键单击它 - &gt;属性 - &gt;数据库设置,在数据库默认位置下 ,&#34; Log:path / to / your / logs /&#34;。

环顾四周后,无法找到如何与sysadmin用户建立多个连接,感觉它是不可能的(即使我在SQL Server Express版本上做过,也许它没有配置以同样的方式或者&#34; sa&#34;用户不是真正的系统管理员,或者它是单线程阻止实际打开多个连接的事实。)

作为一种解决方案,我会尝试制作一个不像系统管理员一样的用户。

如果您最终遇到类似非系统管理员的用户try using sp_configure 'user connections', 0的问题,并且您使用单个连接check if TCP is enabled拥有原始错误。