NHibernateを使用してレガシーrdbmsシステムに接続しています。実稼働負荷が高い場合、rdbmsサービスは失敗します。可用性を維持するために、フェイルオーバーrdbmsサービスがあります。プライマリ接続がダウンしたときにフェイルオーバー接続文字列を使用するようにNHibernateを設定する方法はありますか?
追加情報:NHibernateよりもCastleを使用しています。Castleがフェイルオーバー接続の処理を提供する場合、それは私にもそれを行います。
NHibernateを使用してレガシーrdbmsシステムに接続しています。実稼働負荷が高い場合、rdbmsサービスは失敗します。可用性を維持するために、フェイルオーバーrdbmsサービスがあります。プライマリ接続がダウンしたときにフェイルオーバー接続文字列を使用するようにNHibernateを設定する方法はありますか?
追加情報:NHibernateよりもCastleを使用しています。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は、ミラーリングされたDBおよび接続/サーバーの障害に対して、フェイルオーバーパートナーを提供するADOを使用します。フェイルオーバーパートナーに関連するstackOverflowの質問がここにあります。