2012-02-13 40 views
2

我一直在玩弄幾種方法批量插入10,000個對象列表到我的數據庫。NHibernate批量插入沒有選擇ID末尾

這些對象沒有任何關係,只存儲POCO數據。

我已經開始使用StatelessSession,因爲很多文章都提出過這個問題,我注意到了一個明顯的改進。

有一件事仍然存在 - 每次插入後NHibernate都會執行一個SELECT語句來獲取剛剛插入的對象的ID。有沒有辦法推遲到我真的要查詢對象?如果NHibernate可以插入行而不用擔心ID,這似乎是一個巨大的性能優勢。

這可能嗎?

回答

2

沒有它不可能,有時這是值得考慮的工作的工具。如果你的桌子上有一個標識列,那麼NHibernate ALWAYS會跟着一個插入選擇,即使插入了BULK插入。另一件需要考慮的事情是,你的一級緩存將會變得相當大(除非你使用無狀態會話),這可能會導致其他複雜情況。

我理解你的觀點想使用的NHibernate的善良,但有時我們只是無法避免使用其他工具...

如果我需要10K鑲發送到我的數據庫我一會用SQlBulkCopy類和完全繞過NHibernate。

SQLBulkCopy使您可以有效地批量加載來自其他來源的 數據的SQL Server表。

here for more信息

+0

謝謝你的洞察力。不幸的是,我的目標之一是保持數據庫不可知論。因爲這個 - 我可能會用10到15秒的時間插入10行NHibernate。 – Origin 2012-02-13 06:47:12

+0

個人而言,我仍然會爲SQL Server使用'SQLBulkCopy',因爲這會使您的應用程序更加靈活,並且不會爲其他用戶/使用綁定資源。我祝你好運,你的目標! – Rippo 2012-02-13 06:52:57

+0

雖然數據庫不可知的理想是好的,但在實踐中可能很難實現 – 2012-02-14 04:01:33

0

可以更改ID代使用的GUID或其他一些服務器端的計算類型,因此SQL並不需要返回的ID,你已經認識他們,只是通過他們的SQL查詢插入

看到this爲可用的更多細節有點接近

this更深入的解釋到發電機

+2

感謝。我瞭解不同類型的發電機,但不想用它們來解決這個問題。應該可以告訴NHibernate它可以拋出對象並且不將它保存在緩存中(在這一點上它不需要選擇ID) – Origin 2012-02-13 02:54:09

+0

像你一樣做一個大的導入它可能是值得的下降到sql級別,如果你的模型足夠簡單,直接發佈sql,否則你可能可以使用HQL來實現某些功能。一般來說,我認爲不斷變化的發電機是你成功的最佳機會,因爲他們設計的目的是做到這一點,我不認爲你可以讓自己「忘記」像你想要的物體 – 2012-02-13 03:08:53

+0

有沒有你不想要的特殊原因使用不同的發電機? – 2012-02-13 03:53:09