3

NHibernateを使用してレガシーrdbmsシステムに接続しています。実稼働負荷が高い場合、rdbmsサービスは失敗します。可用性を維持するために、フェイルオーバーrdbmsサービスがあります。プライマリ接続がダウンしたときにフェイルオーバー接続文字列を使用するようにNHibernateを設定する方法はありますか?

追加情報:NHibernateよりもCastleを使用しています。Castleがフェイルオーバー接続の処理を提供する場合、それは私にもそれを行います。

4

2 に答える 2

5

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

Nhiberbateは、ミラーリングされたDBおよび接続/サーバーの障害に対して、フェイルオーバーパートナーを提供するADOを使用します。フェイルオーバーパートナーに関連するstackOverflowの質問がここにあります。

于 2015-08-25T13:51:19.610 に答える