我在测试环境中设置了一个 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="data source=sqlinstance;initial catalog=TestDB;integrated security=True;
MultiSubnetFailover=true;
connect timeout=150;
ConnectRetryCount=15;
ConnectRetryInterval=10;
MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
我所期待的是 SqlClient 尝试重新连接到我的集群实例 15 次,间隔为 10 秒,然后在故障转移完成后成功重新连接。但它仍然不断抛出异常。
我尝试更改“Connect Timeout”、“ConnectRetryCount”和“ConnectRetryInterval”值,但故障转移后仍然没有成功完全重新连接...
我很困惑,我在这里缺少什么,或者我可以不依赖底层的 SqlClient 并且我是否必须在 DAL 中提供我的 owm 重试逻辑?