【发布时间】:2014-06-20 09:32:56
【问题描述】:
我们有一个企业数据库,可以通过世界各地的许多站点进行复制。我们希望我们的应用程序尝试连接到本地站点之一,如果该站点关闭,我们希望它回退到企业数据库。我们希望我们的每个数据库操作都有这种行为。
我们正在使用实体框架、C# 和 SQL Server。
起初我希望我可以在连接字符串中指定一个“故障转移伙伴”,但这仅适用于镜像数据库环境,但事实并非如此。我还研究了编写自定义 IDbExecutionStrategy。但是这些策略只允许您指定重试失败的数据库操作的模式。它不允许您以任何方式更改操作,例如将其定向到新连接。
那么,除了围绕我们的许多数据库操作重复重试逻辑之外,您是否知道处理此类操作的任何好的模式?
2014-05-14 更新:
我将根据已经提出的一些建议进行详细说明。
我有很多个地方的代码是这样的:
try
{
using(var db = new MyDBContext(ConnectionString))
{
// Database operations here.
// var myList = db.MyTable.Select(...), etc.
}
}
catch(Exception ex)
{
// Log exception here, perhaps rethrow.
}
建议我有一个例程,首先检查每个连接字符串并返回第一个成功连接的字符串。这是合理的。但我看到的一些错误是操作超时,连接工作但数据库存在问题,使其无法完成操作。
我正在寻找的是一种模式,我可以用它来封装工作单元并说:“在第一个数据库上试试这个。如果它因任何原因失败,请回滚并在第二个数据库上尝试它。如果那样失败,在第三次尝试,依此类推,直到操作成功或您没有更多的数据库。”我很确定我可以自己滚动(如果可以,我会发布结果),但我希望可能有一种已知的方法来解决这个问题。
【问题讨论】:
-
我可以要求将其移至 dba.stackexchange.com,但我真的认为这更像是一个编程/实体框架问题,而不是数据库管理问题。我弄错了吗?
-
是的,我可以看到。忽略我之前的陈述:)
-
那么您的交易方法是什么?事务中失败的操作是否应该在事务中间切换到备用数据库?
-
我在这里可能是错的,但我认为这通常属于负载均衡器的范围。
-
是不是像1)打开一个要连接的数据库的连接1st。检查 Connection.State 属性,如果连接是打开的/如果没有打开到您的企业数据库的连接是否良好?
标签: entity-framework database-design