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

时间:2014-12-18 12:38:04

标签: c# .net sql-server failover alwayson

我在测试环境中设置了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角色从Cluster Manager移动到另一个节点)。故障转移过程大约需要50秒。 当故障转移是comlete时,我的测试循环抛出一个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尝试重新连接到我的clusterd实例15次,间隔为10秒,然后在故障转移完成后成功重新连接。但它仍然不断抛出异常。

我尝试更改&#34; Connect Timeout&#34;,&#34; ConnectRetryCount&#34;和&#34; ConnectRetryInterval&#34;值,但在故障转移后仍然没有成功完全重新连接...

我非常困惑,我在这里缺少什么,或者我不能依赖底层的SqlClient而且我必须在DAL中提供我的owm重试逻辑,例如???

1 个答案:

答案 0 :(得分:1)

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