NHibernate и отказоустойчивость соединения с базой данных? - PullRequest
3 голосов
/ 10 марта 2010

Я использую NHibernate для подключения к устаревшей системе rdbms. При высокой производственной нагрузке служба rdbms не работает. Для обеспечения доступности у нас есть служба аварийного переключения rdbms. Есть ли способ настроить NHibernate для использования строки соединения FailOver, когда основное соединение не работает?

Дополнительная информация: я использую Castle over NHibernate. Если Касл обеспечивает обработку аварийных соединений, то это также сделает это для меня.

Ответы [ 2 ]

5 голосов
/ 10 марта 2010

Вы можете создать свой собственный NHibernate.Connection.IConnectionProvider, который обеспечивает поддержку отработки отказа.

Это должен быть подкласс ConnectionProvider, который переопределяет CloseConnection() GetConnection() и Configure().

Поставщик подключения указан в вашей спящей конфигурации как свойство 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)");
        }
    }
}
0 голосов
/ 25 августа 2015

Nhiberbate использует ADO, который предоставляет Failover Partner, для зеркальных БД и сбоев соединения / сервера. Есть вопрос stackOverflow ЗДЕСЬ , который относится к отказоустойчивому партнеру.

...