如何在多数据库相同的模式环境中有效地使用NHibernate ISessionFactory

本文关键字:有效地 环境 ISessionFactory NHibernate 模式 多数据 数据库 | 更新日期: 2023-09-27 18:06:12

我们正在开发一个MVC应用程序,并且有一个环境,其中所有客户端都有自己的数据库副本,所有都具有相同的模式。在某些情况下,用户可能需要在一个请求中访问多个客户机数据库。我试图避免每次应用程序需要打开一个新的客户端数据库时创建ISessionFactory的实例。所有其他设置都是相同的,所以我真的只是想要一种方法来改变ISessionFactory创建后的连接字符串。从我的研究来看,这似乎是不可能的。

大多数人认为本文是首选的解决方案,基本上是缓存配置,这样就不需要每次调用使用不同连接字符串创建会话工厂时都重新评估配置。这篇文章是几年前的了,所以我想知道是否有人提出了一种更有效的方法来更改连接字符串或处理这种类型的多租户环境?

如何在多数据库相同的模式环境中有效地使用NHibernate ISessionFactory

在我的例子中,我派生自DriverConnectionProvider,覆盖GetConnection方法,为当前租户使用正确的连接字符串。选择连接字符串的逻辑封装在一个Provider对象中:

public class HibernateConnectionProvider : NHibernate.Connection.DriverConnectionProvider
{
    public static IProvider<string> ConnectionStringProvider { private get; set; }
    protected override string ConnectionString
    {
        get { return ConnectionStringProvider.ProvideValue(); }
    }
}

我认为在MVC应用程序中委托数据库访问管理是错误的!

这应该委托给DevOps。要做到这一点,您将需要每个客户的MVC应用程序,然后您就不需要担心支持数据库选择的代码,尽管这是以额外的应用程序为代价的。然而,我认为这是双方较小的邪恶。

在目前的工作中,我们有这种架构(在你分享的帖子的时候设计的),它确实导致了许多问题。例如,一个客户需要特性A,这需要数据库迁移B,这意味着停止所有客户的服务,并且经常是未处理的情况。