2013-03-18 78 views
5

這裏有些問題在StackOverflow的有關NHibernate和多個數據庫(動態連接),解決我認爲,最好的解決辦法是保持的SessionFactory的緩存(每個數據庫)和緩存配置,以更快地構建SessionFactory。緩存的SessionFactory和配置與NHibernate多個數據庫

我想知道,如果這種做法是正確的,和主要表現在:什麼是每實例和時間內存消耗方面的SessionFactory的「權重」要建?

更多關於我的方法:

衆所周知,1號和2級高速緩存住在SessionFactory的「境界」,我們可以假設內存消耗可能(涉及的ISession的開啓量,其中包括第一級緩存級別)。

對於第二級緩存級別,在我的情況下,數據庫共享相同的模式,並有一些通用只讀表,我可以使用全局緩存實現共享所有SessionFactory只讀表,這對我的項目聽起來不錯。

我說錯了嗎?這種方法可能會帶來什麼樣的性能和內存問題?考慮一個Web應用程序(ASP.NET MVC,而不是Webforms)訪問它需要的每個HTTP REQUEST中的數百個(或者可能是數千個)數據庫,找到用戶數據庫並解決對它的訪問(獲取,使用和部署ISession)。

連接池: 又是怎麼回事連接池?它應該有什麼樣的行爲來管理數百或數千個數據庫池,就像這種方法一樣?一些與NHibernate一起使用的實現可能會有所幫助,或者我需要構建自己的?

+1

我們使用的NHibernate的multinenant設置與約20-30會話工廠,我不記得確切的數字,但內存消耗是越來越對每個租戶增加明顯較高。您可以使用自定義的'IConnectionProvider'實現窮人的多租戶支持,但在這種情況下您將無法使用二級緩存。多租戶功能由原始Hibernate(每個多個數據庫連接一個會話工廠)支持,並且存在NHibernate的pull請求,在github上實現此功能的一部分 - https://github.com/nhibernate/nhibernate-core/pull/91。 – Vasea 2013-03-25 15:45:55

回答

2

一些測試證實了一些人說,要構建配置和SessionFactory的展臺價格昂貴的時間和資源(CPU和內存),但SessionFactory則是更多的,貴了不少。但不幸的是,我們只有單獨的測試和經驗結果,比如我的測試依賴於我的課堂模型。因此,我一直認爲我需要緩存SessionFactory和Configuration,但是如果我們在Web解決方案中有數百個數據庫,那麼我們有一個很大的問題,因爲SessionFactory渴望內存,它是一個「內存佔用者」,我可以得到接近400個實例的OutOfMemoryException,我希望能夠訪問數千個數據庫。

嗯,因爲我們使用的SQLServer,我們設計了一個高速緩存只有一個SessionFactory的每個SQLServer的實例,而不是一個對每個數據庫,所以在ConnectionProvider等我們可以注入SQL命令USE 'catalog-name'這準備每一個連接才能正常工作每個請求分別提供數據庫。

我希望其他人同樣的問題還可以探討這樣的,從SQLServer的資源,儘管有些數據庫只允許你這樣做,通過架構名稱,而不是數據庫(目錄名)。

好運。

+0

這樣簡單的提供一個到ISession.OpenSession的IDbConnection是這樣的:'var conn = myApp.GetOpenConnection(); var session = sessions.OpenSession(conn);'? – 2018-01-19 10:18:26

+0

沒有。上下文(例如緩存)不在連接的範圍內,您可以沿「上下文」(會話)更改連接。另一個數據庫(連接),但是緩存的數據/會話呢? – Luciano 2018-01-19 10:30:55