3

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

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

4

2 回答 2

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)");
        }
    }
}
于 2010-03-10T12:47:13.890 回答
0

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

于 2015-08-25T13:51:19.610 回答