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

Ami*_*abh 3 nhibernate ado.net failover castle-activerecord

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

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

Lac*_*che 5

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

这应该是ConnectionProvider覆盖CloseConnection() GetConnection()和的子类Configure()

连接提供程序在您的休眠配置中指定为property 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)");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)