NHibernate和数据库连接故障切换?

NHibernate和数据库连接故障切换?,nhibernate,ado.net,castle-activerecord,failover,Nhibernate,Ado.net,Castle Activerecord,Failover,我正在使用NHibernate连接到遗留的rdbms系统。在高生产负载下,rdbms服务失败。为了保持可用性,我们提供了故障转移rdbms服务。是否有方法将NHibernate配置为在主连接关闭时使用故障转移连接字符串 附加信息:我使用的是城堡。如果Castle提供故障转移连接的处理,那么我也可以这样做。您可以构建自己的NHibernate.Connection.IConnectionProvider,它提供故障转移支持 这应该是ConnectionProvider的子类,它覆盖CloseCon

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


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

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

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

连接提供程序在hibernate中指定为属性
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)");
        }
    }
}
公共类FailoverConnectionProvider:ConnectionProvider
{
静态字符串FailoverConnectionStringProperty=“connection.failover\u connection\u string”;
字符串故障转移\u连接字符串;
公共覆盖无效关闭连接(IDbConnection conn)
{
底座。闭合连接(连接);
conn.Dispose();
}
公共覆盖IDbConnection GetConnection()
{
试一试{
返回GetConnection(ConnectionString);
}抓住{
返回GetConnection(故障转移连接字符串);
}
}
IDbConnection GetConnection(字符串连接字符串)
{
调试(“从驱动程序获取IDbConnection”);
IDbConnection conn=Driver.CreateConnection();
试一试{
conn.ConnectionString=connstring;
conn.Open();
}捕获(例外){
conn.Dispose();
投掷;
}
返回连接;
}
公共覆盖无效配置(IDictionary设置)
{
配置(设置);
设置.TryGetValue(FailoverConnectionStringProperty,out failover\u connstring);
如果(故障转移\u connstring==null){
抛出新的HibernateeException(“找不到连接字符串设置(设置“+FailoverConnectionStringProperty+”属性)”);
}
}
}

Nhiberbate使用ADO(提供故障转移伙伴)处理镜像DBs和连接/服务器故障。有一个stackOverflow问题与故障转移伙伴有关。

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