gpt4 book ai didi

c# - 我怎样才能使 NHibernate 在数据库停机时幸存下来?

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:09 25 4
gpt4 key购买 nike

我有一个 C# 控制台应用程序,我想继续运行它,即使它的数据库崩溃了。在那种情况下,它应该轮询数据库以查看它何时恢复在线,然后恢复操作。我有这个代码,但我不喜欢:

    public static T Robust<T>(Func<T> function)
{
while (true)
{
try
{
return function();
}
catch (GenericADOException e)
{
Console.WriteLine("SQL Exception. Retrying in 10 seconds");
Thread.Sleep(10000);
}
}
}
[...]
N.Robust(() => Session.CreateCriteria(typeof(MyEntity)).List());

问题是我必须在任何地方插入讨厌的 N.Robust 结构,这会使代码困惑。另外,我冒着把它忘在某个地方的风险。我一直在研究为此使用 NHibernate 的 EventListeners 或 Inceptors,但一直无法使其工作。我真的必须 fork NHibernate 才能完成这项工作吗?

更新好吧,所以我已经能够克服我的两个问题之一。通过注入(inject)我自己的事件监听器,我至少可以确保对数据库的所有调用都通过上述方法。

        _configuration.EventListeners.LoadEventListeners
= new ILoadEventListener[] { new RobustEventListener() };
[...]
public class RobustEventListener : ILoadEventListener
{
public void OnLoad(LoadEvent e, LoadType type)
{
if (!RobustMode)
throw new ApplicationException("Not allowed");
}
}

我的代码库仍然杂乱无章,但我认为为增加服务正常运行时间付出的代价是合理的。

最佳答案

容忍数据库停机的一种架构方法是使用队列(客户端和/或服务器端)。对于静态或大部分静态数据的读取,在客户端缓存一个到期窗口(比如 15 - 30 分钟)。

如果您有复杂的数据库事务,这是非常重要的。

像你提议的那样 sleep ,很少是个好主意。

另一个选项(主要用于偶尔连接的应用程序)是使用数据库复制。使用具有复制支持的 RDBMS(例如 Sql Server),让您的应用程序始终与本地数据库对话,并让复制引擎在连接建立时自动处理与远程数据库的同步。这可能会引入冲突管理/解决的问题。

关于c# - 我怎样才能使 NHibernate 在数据库停机时幸存下来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4982013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com