我正在使用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