SQL Server 2014 群集故障转移实例,如何在故障转移时重新连接

本文关键字:故障 转移 重新连接 实例 Server 2014 群集 SQL | 更新日期: 2023-09-27 18:34:44

我已经在测试环境中设置了一个Windows Server故障转移群集,并在其上安装了一个群集SQL Server 2014实例。群集有两个节点,网络名称为 SQLINSTANCE。

现在从小型控制台应用程序中,我有一个简单的循环(运行良好(,每 100 毫秒查询一次测试数据库:

while (true)
{
   using (var dbContext = new TestDBContext())
   {
       foreach (var person in dbContext.People)
       {
            Console.WriteLine(person.FirstName + " " + person.LastName);
            System.Threading.Thread.Sleep(100);
       }
    } 
 }

现在,我在群集上强制进行故障转移(通过关闭一个节点,或将 SQL Server 角色从群集管理器移动到另一个节点(。故障转移过程大约需要 50 秒。当故障转移完成时,我的测试循环会抛出一个 EntityException,说"底层提供程序在打开时失败"。InnerException是一个SqlClient.SqlException,表示"无法打开登录请求的数据库"TestDB"。登录失败。用户'域''用户'登录失败。

我已经像这样设置了我的连接字符串:

 <add name="TestDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;
         provider connection string=&quot;data source=sqlinstance;initial catalog=TestDB;integrated security=True;
         MultiSubnetFailover=true;
         connect timeout=150;
         ConnectRetryCount=15;
         ConnectRetryInterval=10;
         MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

我所期望的是,SqlClient 尝试重新连接到我的集群实例 15 次,间隔为 10 秒,然后在故障转移完成后成功重新连接。但它仍然不断抛出异常。

我尝试更改"连接超时","连接重试计数"和"连接重试间隔"值,但故障转移后仍然没有成功完全重新连接...

我很困惑,我在这里错过了什么,或者我不能依赖底层 SqlClient,例如我是否必须在 DAL 中提供我的 owm 重试逻辑???

SQL Server 2014 群集故障转移实例,如何在故障转移时重新连接

我不是所有这些方面的专家,特别是,我不确定 C# 如何处理数据库连接。我在我们的一个应用程序上看到的是,您在 AlwaysOn 集群中打开了与数据库的连接,当您故障转移应用程序时,连接仍在使用与实际转到节点的相同底层 TCP 连接,该节点现在已经更改。对我们来说,解决方案是在捕获异常时正确重新连接。