NHibernate和数据库连接故障转移?

时间:2010-03-10 12:31:09

标签: nhibernate ado.net castle-activerecord failover

我正在使用NHibernate连接到传统的rdbms系统。在高生产负载下,rdbms服务失败。为了保持可用性,我们提供了故障转移rdbms服务。有没有办法在主连接关闭时配置NHibernate使用FailOver连接字符串?

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

2 个答案:

答案 0 :(得分:5)

您可以构建自己的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 :(得分:0)

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