2011-12-03 114 views
1

我們試圖在VS2010和Oracle的項目中第一次使用nHibernate。nHibernate很痛苦

應用程序的性能是接受這個項目的關鍵標準,我們應該在這個項目中使用nHibernate嗎?

我們正在經歷POC。我們有一個250列的表格,當試圖插入500條記錄時,應用程序就會死機。

有人可以建議關於nHibernate與PL/SQL CRUD的性能比較。

不知道我們應該在nHibernate配置文件中使用哪個參數來獲得最佳性能?

我們用下面的配置,預期

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory name="DefaultSessionFactory"> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property> 
    <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property> 
    <property name="??;</property> 
    <property name="show_sql">true</property> 
    <property name="use_proxy_validator">false</property> 

    </session-factory> 
</hibernate-configuration> 

感謝。

+1

不知道它會產生多大的差異,但有了show_sql,並且給定了大量的列,NHibernate將會向控制檯寫入相當多的輸出,這不是一個特別快速的操作。本身。關閉它可能會看到更多具有代表性的表現。 – Iridium

+2

我認爲這不是一個公平的考驗。如果你想絕對100%的性能,那麼你不應該使用ORM(在我看來)如果你可以輕鬆地獲得ORM的輕鬆性能...然後使用ORM。但是在測試NH時,對於設計不佳的數據庫而言,這並沒有意義。 – Phill

+0

發佈一些演示此問題的示例代碼。 –

回答

1

銥星建議關閉show_sql是一個不錯的選擇。如果你使用的是log4net,你應該確保你爲NHibernate設置了日誌級別。如果您將級別設置爲DEBUG應用程序範圍,則NHibernate將記錄大量條目。

<logger name="NHibernate"> 
    <level value="ERROR" /> 
</logger> 
1

約show_sql和記錄的suggestiongs有一定影響,但即使有這些,你不應該讓應用程序磨癱瘓只是因爲NHibernate的的問題。當然,使用orm作爲回報,在維護性和快速創建應用程序的能力方面會有一些性能損失,但在大多數情況下,這是不夠的。

如果你有嚴重的性能問題,我建議你的應用程序中有東西引起這種情況。它不僅僅是nhibernate,而且使用別的東西會讓它變得更好(除非你正在做別的事情)。首先想到的是,您應該知道系統中事務的隔離級別。取決於您如何管理會話和交易,您可能會使用比您需要的更高的隔離級別並且不必要地鎖定數據庫實體。這可能會導致你描述的內容和死鎖。 system.tranactions的默認隔離級別是可序列化的,這是大時間鎖定,可能不是你想要的。您可以設置默認爲NHibernate的生成交易:如果您使用System.Transactions的(TransactionScope的)

<add key="hibernate.connection.isolation" value="ReadCommitted" /> 

,您可以指定在構造函數中的隔離級別。如果您使用wcf,則有屬性和配置以及其他管理方法。在不瞭解應用程序的情況下,很難說更多,這只是猜測這是否是您的問題。

+0

謝謝。我會嘗試你的建議。我相信我在做一些錯誤的事情。該應用程序將有超過300列,但我想用4列實體,它需要30秒插入100行,並且相同的插入需要2-3秒正常pl/sql插入查詢。 –

+0

true幫助了我,它只用了3秒鐘,而之前的時間是30秒。非常感謝。 「幫助雙手比祈禱雙脣聖潔」 –

0

我知道你已經接受了一個答案,但是想要拋出我的2c。

首先,你一天的您的意見之一:

該應用程序將有超過300列

那obsurb。如果你正在做的是報告,不要使用ORM,如果它沒有報告,那麼我會說你的數據庫設計很差,沒有理由有300列。我不瞭解Oracle,但是在SQL Server中,當行長度超過8k時,您可能會在列的不同頁面上出現性能問題。

生成的查詢會很大。你最好使用存儲過程而不使用ORM。

,但我是4列實體嘗試,它正在採取30秒,插入100行和相同的插入正在採取2-3秒與正常PL/SQL插入查詢

有很多原因爲什麼會這樣呢?如果你在數據庫中生成身份,那麼NHibernate必須拋出另一個select來檢索Id以應用到剛剛插入的Model。

讓NHibernate生成身份可以通過HiLo或Guid/GuidComb加快速度。

爲每個插入打開一個全新的會話時,也可能會增加成本,爲插入重新使用相同的會話,並將插入批處理而不是發送單個語句。 (我不知道Oracle是否支持像SQL Server一樣的批處理)

無論哪種方式,您都沒有提供任何代碼來顯示您的測試,以便爲任何人指出它爲什麼對您來說很慢。 NH對99%的人們需求表現非常好。