我正在尝试在本地 SQL Server 上加载测试一些纯 SQL 查询(我不确定这是测试性能的最佳方式,但这会给我一个粗略的估计)。我正在为 SQL Server 使用 Java 的 PreparedStatement 和 MS JDBC,并且我实例化了一百个线程Connection
,每个线程中都有一个新线程。
我已经安装了 SQL Server Express 版本 (11.0.210)。不幸的是,Express 版不会并行运行多个查询(Pro 版也是如此),所以我的测试不会很有用。
一位同事告诉我我可以使用 SQL Developer 2014。我在设置它时遇到了一些困难,所以我可能忘记了一些东西。我开始使用它与 sysadmin (sa) 帐户。
Connection
使用 JDBC制作单曲并查询按预期工作。
现在,我正在尝试创建两个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”和“防火墙阻止 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 -> 属性 -> 数据库设置中右键单击它,在数据库默认位置下,“日志:路径/到/您的/日志/”。
环顾四周,找不到如何与 sysadmin 用户建立多个连接,感觉不可能(即使我在 SQL Server Express 版本上这样做,也可能没有以相同的方式配置或“sa”用户不是真正的系统管理员,或者它是单线程的事实阻止了实际打开多个连接)。
作为解决方案,我将尝试创建一个不是类似 sysadmin 的用户。
如果您最终遇到了非 sysadmin-like 用户的问题,请尝试使用 sp_configure 'user connections', 0,如果您在单个连接中遇到原始错误,请检查是否启用了 TCP。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句