NHibernate 和数据库连接故障转移?
Posted
技术标签:
【中文标题】NHibernate 和数据库连接故障转移?【英文标题】:NHibernate and database connection failover? 【发布时间】:2011-01-25 21:15:54 【问题描述】:我正在使用 NHibernate 连接到旧的 rdbms 系统。在高生产负载下,rdbms 服务会失败。为了保持可用性,我们有一个故障转移 rdbms 服务。有没有办法将 NHibernate 配置为在主连接断开时使用故障转移连接字符串?
附加信息:我在 NHibernate 上使用 Castle。如果 Castle 提供对故障转移连接的处理,那么我也可以这样做。
【问题讨论】:
【参考方案1】:您可以构建自己的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)");
【讨论】:
+1 如何指定 NHibernate 以使用此自定义 ConnectionProvider? @Lachlan:如果我们在 Asp.Net 应用程序中使用 OpenSessionInView 模式,那么 OpenConnection 请求可能每个请求只出现一次。如果请求之间的连接失败,则此解决方案可能不起作用。 会话或事务期间的数据库异常很容易使会话进入无效状态。在这种情况下,您可以在 page.OnError 中捕获错误并使用 Server.Transfer 通过新的会话和连接重新启动请求。 您是否必须添加一些额外的东西才能让 NHibernate 自然地解析故障转移连接字符串的自定义属性?我一直无法让它通过 NHibernate 的内部验证。【参考方案2】:Nhiberbate 使用 ADO,它为镜像数据库和连接/服务器故障提供故障转移伙伴。有一个与故障转移合作伙伴有关的 *** 问题HERE。
【讨论】:
以上是关于NHibernate 和数据库连接故障转移?的主要内容,如果未能解决你的问题,请参考以下文章
配置 GlassFish JDBC 连接池以处理 Amazon RDS 多可用区故障转移
如何在 JavaEE 应用程序中为 PostgreSQL 热备设置配置连接故障转移?
在 Wildfly-17 中的数据库故障转移期间回滚事务时,数据库连接不会从池中删除