1

我在测试环境中设置了一个 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 服务器角色从集群管理器移动到另一个节点)。故障转移过程大约需要 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 秒,然后在故障转移完成后成功重新连接。但它仍然不断抛出异常。

我尝试更改“Connect Timeout”、“ConnectRetryCount”和“ConnectRetryInterval”值,但故障转移后仍然没有成功完全重新连接...

我很困惑,我在这里缺少什么,或者我可以不依赖底层的 SqlClient 并且我是否必须在 DAL 中提供我的 owm 重试逻辑?

4

1 回答 1

1

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

于 2015-04-17T06:43:06.300 回答