【问题标题】:NHibernate and database connection failover?NHibernate 和数据库连接故障转移?
【发布时间】:2011-01-25 21:15:54
【问题描述】:

我正在使用 NHibernate 连接到旧的 rdbms 系统。在高生产负载下,rdbms 服务会失败。为了保持可用性,我们有一个故障转移 rdbms 服务。有没有办法将 NHibernate 配置为在主连接断开时使用故障转移连接字符串?

附加信息:我在 NHibernate 上使用 Castle。如果 Castle 提供对故障转移连接的处理,那么我也可以这样做。

【问题讨论】:

    标签: nhibernate ado.net castle-activerecord failover


    【解决方案1】:

    您可以构建自己的NHibernate.Connection.IConnectionProvider,它提供故障转移支持。

    这应该是ConnectionProvider 的子类,它会覆盖CloseConnection() GetConnection()Configure()

    连接提供程序在您的休眠configuration 中指定为属性connection.provider

    这是一个基于 DriverConnectionProvider 的未经测试的实现。

    public class FailoverConnectionProvider : ConnectionProvider
    {
        static string FailoverConnectionStringProperty = "connection.failover_connection_string";
        string failover_connstring;
    
        public override void CloseConnection(IDbConnection conn)
        {
            base.CloseConnection(conn);
            conn.Dispose();
        }
    
        public override IDbConnection GetConnection()
        {
            try {
                return GetConnection( ConnectionString );
            } catch {
                return GetConnection( failover_connstring );
            }
        }
    
        IDbConnection GetConnection( string connstring )
        {
            log.Debug("Obtaining IDbConnection from Driver");
            IDbConnection conn = Driver.CreateConnection();
            try {
                conn.ConnectionString = connstring;
                conn.Open();
            } catch (Exception) {
                conn.Dispose();
                throw;
            }
    
            return conn;
        }
    
        public override void Configure(IDictionary<string, string> settings)
        {
            base.Configure( settings );
    
            settings.TryGetValue(FailoverConnectionStringProperty, out failover_connstring);
    
            if (failover_connstring == null) {
                throw new HibernateException("Could not find connection string setting (set " + FailoverConnectionStringProperty + " property)");
            }
        }
    }
    

    【讨论】:

    • +1 如何指定 NHibernate 以使用此自定义 ConnectionProvider?
    • @Lachlan:如果我们在 Asp.Net 应用程序中使用 OpenSessionInView 模式,那么 OpenConnection 请求可能每个请求只出现一次。如果请求之间的连接失败,则此解决方案可能不起作用。
    • 会话或事务期间的数据库异常很容易使会话进入无效状态。在这种情况下,您可以在 page.OnError 中捕获错误并使用 Server.Transfer 通过新的会话和连接重新启动请求。
    • 您是否必须添加一些额外的东西才能让 NHibernate 自然地解析故障转移连接字符串的自定义属性?我一直无法让它通过 NHibernate 的内部验证。
    【解决方案2】:

    Nhiberbate 使用 ADO,它为镜像数据库和连接/服务器故障提供故障转移伙伴。有一个与故障转移合作伙伴有关的 stackOverflow 问题HERE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      相关资源
      最近更新 更多