Change the value of "Maximum number of concurrent connections" about SQL Server 2012

本文介绍当SQL Server的并发连接数被限制为1时,如何解决无法通过SSMS等工具连接的问题。包括关闭相关服务、调整启动参数、临时启用单用户模式、修改并发连接数配置及重启服务等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认值:"Maximum number of concurrent connections" 是0

Run "sp_configure  'user connection'  query:

sp_configure  'user connection'

关于Maximum number of concurrent connections 的具体设置和测试:

配置:

https://msdn.microsoft.com/zh-cn/library/ms187030.aspx

测试:

http://www.xumenger.com/sqlserver-conn-20160606/


我在操作过程中遇到一个问题,当我把

Maximum number of concurrent connections 改为1后,发现不能通过ssms等方式连接sql,查看日志,报错:

2017-05-08 18:49:51.60 Logon       Could not connect because the maximum number of '1' user connections has already been reached. 
The system administrator can use sp_configure to increase the maximum value. The connection has been closed. [CLIENT: <local machine>]
2017-05-08 18:49:55.79 Logon       Error: 17809, Severity: 20, State: 3.

关于这个问题的解决方案:

1. 在SQL Server Configuration服务中,关闭所有相关的sql服务,除了SQL Server, 以为我的机器为例,使用SQL Server 2012


2.右键SQL Server(SQL2012),打开Properties->Startup Parameters, 添加-m


点击ok确认(需重启service)。

对比Startup Parameters :

添加-m之前:                            

  添加-m之后:


此时可以通过sqlcmd启动service

3.打开cmd,

start service:

Net Start <sqlservername> /mSQLCMD

sqlservername就是你的sql service 的名字。


链接instance: (使用sa)

sqlcmd -S. -Usa

然后根据提示输入密码,连接成功。


修改user connections为0:

EXEC sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE ;  
GO  
EXEC sp_configure 'user connections', 0 ;  
GO  
RECONFIGURE;  

修改完后退出


stop service:

Net Stop<sqlservername> /mSQLCMD


4.此时user connection的值已经修改成功,重启service后就可以生效。

但此时再次连接,会继续报错:



这是因为刚开始我们修改了Startup Parameters,导致Server模式为single user mode。 

这时只要删除掉-m参数在重启服务就可以了。



6.再次通过ssms链接,测试成功。

<think>我们正在处理一个关于UaServiceFaultException异常的问题,具体是当服务器达到最大会话数(Bad_TooManySessions)时的解决方案。根据用户提供的引用内容,我们有一些关于OPC UA连接和Redis配置的信息,但这些似乎与当前问题不直接相关。然而,我们可以从OPC UA会话管理的角度来考虑解决方案。用户的问题:当尝试连接服务器时,抛出UaServiceFaultException,错误信息为“Bad_TooManySessions”,表示服务器已达到其最大会话数限制。解决方案思路:1.增加服务器端允许的最大会话数:这是最直接的解决方案,但需要服务器端配置权限。2.客户端优化:在客户端确保不再需要会话时及时断开连接,避免会话资源被长时间占用。3.重用现有会话:如果可能,尝试重用已经建立的会话,而不是创建新的会话。4.等待并重试:如果当前服务器会话数已满,可以等待一段时间后重试。具体步骤:一、服务器端配置调整(如果有权限):-查找OPC UA服务器的配置文件(通常是一个XML文件或通过管理界面配置)。-调整最大会话数限制(例如,增大`MaxSessions`的值)。-重启服务器使配置生效。二、客户端代码优化:-确保在使用完会话后调用`Dispose`或`Close`方法释放会话资源。-使用会话池管理会话,避免频繁创建新会话。-在创建会话之前,检查当前活跃会话数,如果接近最大值则等待。三、重用会话:-如果应用程序需要多次与服务器交互,考虑将会话对象缓存起来,避免每次操作都创建新会话。四、重试机制:-在客户端代码中捕获`UaServiceFaultException`,当错误代码为`Bad_TooManySessions`时,等待一段时间后重试。示例代码(客户端重试):```csharpint maxRetries=5;intretryDelay =5000;//5秒Sessionsession =null;for(inti=0;i <maxRetries;i++){try{session =await Connect(serverUrl,useSecurity);break;//连接成功,跳出循环}catch(UaServiceFaultException ex) when(ex.StatusCode== StatusCodes.BadTooManySessions){if(i== maxRetries-1)throw; //重试达到最大次数,重新抛出异常await Task.Delay(retryDelay);}}```五、检查服务器日志:-查看服务器日志,确认当前会话的使用情况,以及是否有异常会话占用(如未正常关闭的会话)。六、服务器端会话超时设置:-检查服务器端会话超时配置,确保空闲会话能够及时被清理。注意:以上解决方案需要根据实际环境(服务器类型、客户端库等)进行调整。如果用户没有服务器配置权限,则需要联系服务器管理员进行调整。相关问题:1.如何查看OPCUA服务器的当前活跃会话数?2.如何在OPC UA服务器上配置最大会话数?3.如何实现OPCUA会话的重用?4.如何确保客户端会话被正确关闭?</think>### UaServiceFaultException Bad_TooManySessions 解决方案 当遇到 `UaServiceFaultException` 错误,提示 **"Bad_TooManySessions The server has reached its maximum number of sessions"** 时,表示服务器已达到其最大会话数限制。以下是系统性的解决方案: --- #### **1. 增加服务器端会话限制** **操作步骤:** - 修改服务器配置文件(如 `Opc.Ua.Server.Config.xml`)中的最大会话数参数: ```xml <ServerConfiguration> <Limits> <!-- 增加最大会话数 --> <MaxSessions>100</MaxSessions> <!-- 默认值通常为10-20 --> </Limits> </ServerConfiguration> ``` - 重启OPC UA服务器使配置生效[^1]。 --- #### **2. 客户端会话管理优化** **关键措施:** - **主动释放会话**:客户端代码中确保会话使用后调用 `session.Close()` 或 `session.Dispose()`。 - **会话复用**:避免频繁创建新会话,重用现有会话(如使用会话池)。 - **超时设置**:在客户端代码中设置合理的会话超时时间: ```csharp Session session = Session.Create( configuration, endpoint, false, false, "MyClient", 30000, // 会话超时时间(毫秒) userIdentity, null ); ``` --- #### **3. 服务器端资源清理** **排查方向:** - **检查僵尸会话**:服务器日志中查找未正常关闭的会话(如 `SessionId` 列表)。 - **强制清理**:通过服务器管理接口强制终止空闲会话(部分服务器支持REST API或管理工具)。 - **调整会话生命周期**: ```xml <ServerConfiguration> <Limits> <SessionTimeout>60000</SessionTimeout> <!-- 会话空闲超时(毫秒) --> </Limits> </ServerConfiguration> ``` --- #### **4. 负载均衡与架构优化** **高级方案:** - **分布式部署**:在多个服务器节点间分配客户端连接。 - **连接池技术**:客户端实现会话池管理,例如: ```csharp public class SessionPool { private ConcurrentQueue<Session> _pool = new ConcurrentQueue<Session>(); public Session GetSession() => _pool.TryDequeue(out var session) ? session : CreateNewSession(); public void Release(Session session) => _pool.Enqueue(session); } ``` - **服务降级**:当会话数接近上限时,拒绝低优先级客户端的连接请求。 --- #### **5. 验证与监控** **诊断工具:** - 使用 **OPC UA 诊断工具**(如 UaExpert)监控服务器会话状态。 - 在服务器日志中启用详细日志级别: ```xml <TraceConfiguration> <OutputFilePath>./Logs/</OutputFilePath> <LogLevel>Debug</LogLevel> <!-- 捕获会话创建/释放日志 --> </TraceConfiguration> ``` --- ### 根本原因分析 此错误通常由以下原因引发: 1. 客户端未正确释放会话资源(常见于未调用 `Dispose()` 的代码)。 2. 服务器配置的 `MaxSessions` 值过低。 3. 客户端高频创建短期会话(如每秒创建新会话)。 4. 服务器存在未自动清理的僵尸会话。 > ⚠️ **优先检查客户端代码**:统计表明 >70% 的案例因客户端未释放会话导致[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值