我正在使用 NHibernate 连接到旧的 rdbms 系统。在高生产负载下,rdbms 服务会失败。为了保持可用性,我们有一个故障转移 rdbms 服务。有没有办法将 NHibernate 配置为在主连接断开时使用故障转移连接字符串?
附加信息:我在 NHibernate 上使用 Castle。如果 Castle 提供对故障转移连接的处理,那么这对我也有用。
我正在使用 NHibernate 连接到旧的 rdbms 系统。在高生产负载下,rdbms 服务会失败。为了保持可用性,我们有一个故障转移 rdbms 服务。有没有办法将 NHibernate 配置为在主连接断开时使用故障转移连接字符串?
附加信息:我在 NHibernate 上使用 Castle。如果 Castle 提供对故障转移连接的处理,那么这对我也有用。
您可以构建自己的NHibernate.Connection.IConnectionProvider
,提供故障转移支持。
这应该是ConnectionProvider
覆盖CloseConnection()
GetConnection()
和的子类Configure()
。
连接提供程序在您的休眠配置中指定为 property 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 问题。