【发布时间】:2015-02-17 06:04:02
【问题描述】:
我在测试环境中设置了一个 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 重试逻辑??
【问题讨论】:
-
例外是?我问是因为故障转移可能已完成,但并非所有数据库都在线...
-
这是一个 EntityException,表示“底层提供程序在打开时失败”。 InnerException 是 SqlClient.SqlException,表示“无法打开登录请求的数据库“TestDB”。登录失败。用户“域\用户”登录失败。”它在故障转移完成时被抛出。顺便说一句,我还用这个详细的异常信息编辑了我的问题......
-
问题是无法打开数据库。为什么会出现这种情况?每次重新启动 SQL Server 时,它都需要对数据库进行一些检查。根据大小和待处理的交易,它可能需要几秒钟到几天的时间。您可以在错误日志中验证这一点。您会发现诸如“正在启动数据库 'dbname'”之类的消息以及其他为您提供检查状态信息的消息。
-
@user_0,好吧,这听起来很合理。所以实例已启动,我的应用程序可以建立连接,但数据库尚不可用......您知道任何解决方案,可能内置在 .NET Framework 中吗?我阅读了一些关于 EF6 的执行策略和 SqlAzureExecutionStrategy 的内容。你知道这是否合适,还是我必须提供我自己的逻辑?
-
对此不确定,抱歉。我有一些不同语言的服务。他们通常每 x 次重传连接(x 变量取决于服务或应用程序的种类)
标签: c# .net sql-server failover alwayson