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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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,它为镜像数据库和连接/服务器故障提供故障转移伙伴。有一个与故障转移合作伙伴有关的 *** 问题HERE。

【讨论】:

以上是关于NHibernate 和数据库连接故障转移?的主要内容,如果未能解决你的问题,请参考以下文章

配置 GlassFish JDBC 连接池以处理 Amazon RDS 多可用区故障转移

如何在 JavaEE 应用程序中为 PostgreSQL 热备设置配置连接故障转移?

在 Wildfly-17 中的数据库故障转移期间回滚事务时,数据库连接不会从池中删除

2012故障转移群集的搭建(本人小白)

Oracle 快速连接故障转移不适用于 ODP.NET。获取连接请求超时错误

带有 sql 连接字符串的 perl 脚本看似故障转移点(。)