2010-12-22 54 views
0

場景:使用NHibernate並行插入

需要將大量實體從集成數據庫加載到生產數據庫。我們使用NHibernate將東西加載到我們的prod數據庫中,因爲涉及的業務規則已經使用持久化實體在C#中編寫。一切運行良好,我們將有效的實體加載到數據庫中。 RDBMS是SQL Server 2005(可以升級到2008)。

問題:

實體的數量負荷將很快瘋狂增長,我們非常肯定,這將需要比預期更長,無法滿足客戶的要求。

解決方案(?):

這是很容易簡單地運行在平行的事情:拆分所有實體到水桶和平行進口。

問題是,它們全部插入到同一個表中,並且所有進程都會在表鎖中遇到瓶頸。

所以問題是:有沒有辦法使這些插入的方式,不鎖定表試圖插入同一個表中的其他交易?我聽說過快照隔離級別,但沒有發現任何人使用它的真實。任何指導表示讚賞。

回答

1

是否可以插入到不同的表中(如上所述,每個「桶」一個)並將它們連接到一個視圖中?除了加載時間下降80%外,客戶不會看到任何區別...

1

我對NHibernate沒有任何經驗,但是從.NET中可以使用SqlBulkCopy並行批量加載數據(或者使用BULK INSERT/BCP)。在正在加載的表上應用TABLOCK,並且這些批量操作會在表上取出批量更新鎖,並且如果您有兩個具有批量更新鎖的進程,它們將相處得很好。你需要加載到堆中(表中沒有聚集索引)。

這是相反的,如果你有多個進程正在執行INSERT ... SELECT,例如它將獲得獨佔的表級鎖並因此會相互阻塞。

我推薦this MSDN article - 那裏有更多的細節和信息。希望這種事情對你來說是可能的。

此外,如果可以,請在加載之前從表格中刪除索引,然後重新創建它們 - 這將提高加載速度。

+0

的場景是微妙的,因爲系統必須在保持在線批量加載 – Pedro 2010-12-22 19:28:06

2

我認爲章節10.4 Optimistic concurrency control應該可以幫助你完成你的工作。您可以爲此類型的插入定義明確的隔離級別。文章建議使用版本控制,但如果你不需要這個原因,你的數據只是插入,但沒有更新,你可以跳過。在這種情況下,最後一次提交獲勝

1

「做一兩件事有正確的工具」

不要使用NHibernate的做批量插入,使用普通的ADO.NET命令和批量插入

+0

並且有重複的業務規則嗎?不,謝謝 – Pedro 2010-12-22 19:21:55