2014-03-03 35 views
1

我們正在使用NHibernate訪問我們的數據庫。NHibernate沒有反思?

我們有數據庫,它存儲一個「配置」。我們有「修訂」的概念,這意味着我們數據庫中的每個表都有一個修訂版,當我們做出任何修改(甚至是小修改)時,我們數據庫中的每個字段都會被複制(除非修改不同)。

目標是能夠輕鬆地從一個版本切換到另一個版本,並且能夠刪除一個配置,並且仍然能夠從早期版本或舊版本切換。它意味着當我們改變配置時,我們在數據庫中做了大量的寫作(其他應用程序也必須讀取它)。

這個步驟可能需要很長時間(5-10分鐘,我們有很多表),而將其存儲在xml中需要10-20秒。在分析中花費了一些時間之後,我們有一種印象,NHibernate必須對數據庫映射到c#對象(使用我們的hbm.xml文件)進行大量反思。

我的問題:

  1. 怎樣的NHibernate中的每個對象的讀/寫性能,與反思,對不對?
  2. 它會在每次寫入時進行反射,還是存在一些優化(緩存,...?)
  3. 是否有避免這種「反射」的可能性?就像在build上創建/編譯一些類一樣(比如可以使用實體框架)?
  4. 如果我有一個工作的NHibernate模型,有什麼我可以做的「調整」數據庫訪問,而無需更改數據庫?

非常感謝您的幫助。

+0

這是一個有趣的問題,但它非常寬泛,很難簡潔地回答。也許可以稍微分解一下。我也聽起來像這樣的一切的自動版本可能會真的殺死你的應用程序的性能。 – dove

+0

最後我唯一的問題大多是「3.」這個問題,在我看來,所有其他問題只需要能夠回答這個問題。我願意提出建議,但我認爲這隻會拖延最終問題的複雜性。 是的,我完全同意版本控制有很多缺點,但是我們離不開它(這是一個很大的特性,已經工作了兩年))。 – J4N

+0

您是否使用觸發器來複制數據? – dove

回答

0

在假設它是relection之前。我強烈建議下載(至少免費試用)NHProf,看看NHibernate需要花費多長時間。或者其他一些數據庫分析器。

如果要我猜它是這裏需要數據庫更新的數量,但沒有首先得到一些指標,我不會猜測性能;)

例如,它可能是你需要增加你的在NHibernate的批量大小,如果你做了很多小的更新在一個會話中,您也可以在NH配置文件

<property name="adonet.batch_size">300</property> 
+0

這似乎是非常有趣的,我明天會試試。但NHProf會給我什麼信息?除了每個請求的時間?我的印象是,我只能檢查是否沒有產生大量請求 – J4N

+0

嗨,我用NHProf(但我不能讓他連接到我們的SQL Anywhere數據庫顯然)。我也嘗試設置BatchSize(在'Dialect'實現中:'DefaultProperties [Environment.BatchSize] =「300」;'我不知道它是否是正確的地方,但它沒有改變任何東西。很多警報(目前17'000和增長有關:http://hibernatingrhinos.com/products/NHProf/learn/alert/TooManyDatabaseCalls我目前正在尋找什麼是'MultiQuery',但現在沒有找到很好的參考 – J4N

+0

這正是nhprof擅長的,打破了你的應用程序正在做的事情。17000個警報會在一個會話中建議17000個調用?這是非常多的,這在任何ORM中都不會很好。看看http://lostechies.com/jimmybogard/2010/06/24/bulk-processing-with-nhibernate/ – dove

0

你不能avoir反射來實現,但它不是一個問題。 NHibernate使用大量的Reflection來準備併發布動態代碼。生成的代碼比靜態代碼更快,因爲msil允許你比c#更多的東西。

如果反射用法的實現似乎是你的問題,你可以擴展NHibernate,但寫一個字節碼提供程序。

Personnaly,代理生成器,usertype和property訪問器可以比內置實現更快。

一般來說,引起NHibernate的性能問題往往是:

  • 缺少獲取
  • 精度數據造成不必要的更新
  • 壞映射(結構或簡單數據類型)
  • 壞數據庫/數據表配置
  • 不良承諾策略(沖刷模式爲例)