C NHibernate處理多帳套問題

2021-04-09 02:15:05 字數 1786 閱讀 9684

久仰orm大名由來已久,但真正學習orm才是前兩周的事,在網上挑來揀去,終於決定好好學習一下nhibernate(ibatisnet我也比較感興趣,但是鑑於時間有限,暫時擱置),一來因為其鼻祖hibernate名氣大,二來嘛,因為它是開源的,有機會看看它的原始碼,呵呵!

上網搜了好久,沒搜到幾篇文件,沒法子只能啃hibernate的文件慢慢學習了,不久我就發現乙個問題:nhibernate好像不能同時操作幾個資料庫嘛?假設有這樣分布式系統,它有n個客戶端,乙個應用程式伺服器,多個資料庫伺服器,客戶端可以根據自己的配置通過應用程式伺服器連線到不同的資料庫伺服器(應該就是聽棠描述的所謂多帳套),nhibernate應該如何處理這種情況呢?如果了解一點nhibernate的配置的話,大概就知道是通過configuration.buildsessionfactory獲得isessionfactory介面的,而通過這種方法我們只能利用連線字串指定乙個預設的資料庫,在《在window form中使用nhibernate》一文中提到可以通過增加乙個配置檔案的方式連線到其它的資料庫,但按照原文的意思,如果要使用第二個資料庫,意味著要第二次進行昂貴的buildsessionfactory呼叫,而且假如我們允許使用者建立刪除資料庫的話,配置檔案實在是不夠靈活,那麼有什麼辦法可以達到我們的目的呢?

查閱nhibernate的doc,無意中發現opensession有個overload的方法,可以提供乙個idbconnection的引數,看來老天有眼,直覺告訴我,就是它了!!!經過實驗,只要指定這個引數,就可以輕輕鬆鬆實現動態改變連線的資料庫了!廢話少說,看**……

首先是sessionfactory的**,這裡將sessionfactory實現為單例,主要是因為sessionfactory建立極為耗時耗力,這樣可以避免重複建立。

using system;

using system.reflection;

using system.diagnostics;

using system.data;

using nhibernate;

using nhibernate.cfg;

namespace myproject.services

public static isession opensession()

public static isession opensession(idbconnection connection)

public static void initialize()}}

大家可以發現,我連線的居然master資料庫,嘿嘿,不錯,這就是奧妙所在了,呼叫buildsessionfactory的時候,指定哪個資料庫並沒有太大關係,你可以指定任何乙個資料庫都沒有問題,當然,這樣做的後果就是你必須在opensession的時候指定乙個連線,否則的話,狠狠,後果自負哦!

好了,上面就是全部的關鍵了,接下來就是如何使用的問題了,我這裡舉個例子,以做拋磚引玉之用:

public static void testadduser(user newuser)

catch (exception ex)

finally}}

private void btnadd_click(object sender, eventargs e)

如果沒有問題的話,最終user將被儲存到gcs2資料庫中,而不是master資料庫!事實上,通過改變testadduser成員函式中的連線字串(可以由客戶端傳過來),你說吧,你想連到哪兒?呵呵!

當然大家也看到了,強行指定connection是以犧牲**的平台移植性為代價的。我這裡就強行指定了sqlconnection作為實際連線,當然,這個問題很好解決,乙個簡單工廠就綽綽有餘了,好,enjoy it!

C NHibernate處理多帳套問題

久仰orm大名由來已久,但真正學習orm才是前兩周的事,在網上挑來揀去,終於決定好好學習一下nhibernate ibatisnet我也比較感興趣,但是鑑於時間有限,暫時擱置 一來因為其鼻祖hibernate名氣大,二來嘛,因為它是開源的,有機會看看它的原始碼,呵呵!上網搜了好久,沒搜到幾篇文件,沒...

HNibernate在多帳套應用中的資料連線

習慣用xml檔案配置資料連線?我也是的。在多帳套應用中,我們希望由程式來決定連線資料庫。hnibernate當然也可以,同時開啟幾個連線也是可以的。以下是修改config的 configuration cfg new configuration cfg.setproperty hibernate.d...

多標記處理

description 老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為n的數列,不妨設為a1,a2,an 有如下三種操作形式 1 把數列中的一段數全部乘乙個值 2 把數列中的一段數全部加乙個值 3 詢問數列中的一段數的和,由於答案可能很大,你只需輸出這個數模p的值。input ...