2011-03-09 77 views
5

使用最新版本的NHibernate(可能包括一些插件),可以將實體映射到不同服務器上的多個數據庫而無需DB鏈接?NHibernate:跨不同服務器上的多個數據庫映射實體而不使用數據庫鏈接

對於背景,我正在尋找實施與此DBA.SE post中描述的內容大致相似的內容。

+0

這是一樣的分片? – 2011-03-09 14:13:23

+0

@Jason:分片基本上是關於數據劃分/複製。就我而言,我需要對異構數據存儲的統一視圖。 – 2011-03-09 14:18:13

回答

0

我有一個interesting answernhusers郵件列表。摘譯如下:

從賈森Meckley

[...]如果你是在談論存儲 一個單一的實體跨越多個 數據庫,答案是不乾淨。 您可能可以通過 自定義用戶類型和/或事件 偵聽器來保護對象,但 這可能是一團糟維護。

一種不同的方法是使用 ETL過程將數據從一個數據庫傳輸到另一個數據庫。類似於 複製,但僅傳輸其他數據庫所需的 數據。 你最終得到1個可寫數據庫 和許多讀數據庫。那麼您將域名映射到單個數據庫。

另一個選項是確定爲什麼 有多個數據庫。如果它們 代表不同類型的 數據/對象,則在域中明確表示 這個。例如 CustomerWithAddress是與CustomerOrder不同的 實體。如果您需要兩者的信息 ,則分別查詢每個 數據庫並在代碼中構建 投影。

var x = session1.get(id);
var y = session2.get(id);
return merge(x,y);

0

一些googeling後(雖然我沒有試過還),你可以很明顯至少映射類在同一個服務器上的不同數據庫中的表,在映射使用

<class name="..." table="..." schema="database.schema"> 
    ... 
</class> 

但恕我直言,這是一個糟糕的解決方案,因爲它似乎並不獨立於服務器。顯然,NHibernate只是在創建查詢時將模式值與表值連接起來 - 對於大多數服務器來說,「只要將數據庫放在模式中」就會產生一個HAPPENS工作的語法。但是你並沒有清楚地告訴NHibernate「這是模式」和「這是數據庫」,這樣NHibernate就可以乾淨地決定如何構建查詢 - 通過在不屬於它的地方注入上下文數據來混淆查詢創建。恕我直言,NHibernate應該抑制這種骯髒的黑客攻擊,並拋出一個異常,如果「模式」值包含一個。

無論如何,似乎沒有技術上的原因,爲什麼你不應該更進一步並使用schema =「server.database.schema」,其中「server」是鏈接服務器的名稱(請參閱例如http://technet.microsoft.com/de-de/library/ms190479.aspx

除此之外骯髒的黑客,似乎每個人都使用多個會話工廠建議。

相關問題