我正在使用NHibernate连接到传统的rdbms系统。在高生产负载下,rdbms服务失败。为了保持可用性,我们有一个故障转移rdbms服务。有一种方法可以配置NHibernate在主连接关闭时使用FailOver连接字符串吗?NHibernate和数据库连接故障切换?
附加信息:我在NHibernate上使用Castle。如果Castle提供处理故障转移连接,那么这也将为我执行。
我正在使用NHibernate连接到传统的rdbms系统。在高生产负载下,rdbms服务失败。为了保持可用性,我们有一个故障转移rdbms服务。有一种方法可以配置NHibernate在主连接关闭时使用FailOver连接字符串吗?NHibernate和数据库连接故障切换?
附加信息:我在NHibernate上使用Castle。如果Castle提供处理故障转移连接,那么这也将为我执行。
您可以构建自己的NHibernate.Connection.IConnectionProvider
,它提供故障转移支持。
这应该是ConnectionProvider
的子类,它覆盖了CloseConnection()
GetConnection()
和Configure()
。
连接提供程序在您的休眠configuration中指定为属性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问题HERE涉及故障转移伙伴。
+1如何指定NHibernate然后使用此自定义ConnectionProvider? – Amitabh 2010-03-10 12:51:22
@Lachlan:如果我们在Asp.Net应用程序中使用OpenSessionInView模式,那么OpenConnection请求可能每个请求只出现一次。如果连接在请求之间失败,则此解决方案可能无法工作。 – Amitabh 2010-03-10 13:15:19
会话或事务期间的db异常很容易使会话进入无效状态。在这种情况下,您可以捕获page.OnError中的错误并使用Server.Transfer重新启动具有新会话和连接的请求。 – 2010-03-10 15:19:37