我试图在我的本地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配置问题,但无法找到任何相关内容。
我在某处遗漏了什么吗?有没有办法获得更明确的错误?
答案 0 :(得分:0)
在您的情况下,要测试性能,请使用SqlStress应用程序。
答案 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拥有原始错误。