Отказоустойчивость NHibernate и подключения к базе данных?

StackOverflow https://stackoverflow.com/questions/2416813

Вопрос

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

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

Это было полезно?

Решение

Вы можете создать свой собственный 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)");
        }
    }
}

Другие советы

Nhiberbate использует ADO, который предоставляет партнера по отработке отказа, для зеркальных баз данных и сбоев подключения / сервера.Возникает вопрос о StackOverflow ЗДЕСЬ это относится к партнеру по отказоустойчивости.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top