2009-02-18 123 views
7

嗨我正在一個項目,我們需要每天處理幾個xml文件,並使用這些文件中包含的信息填充數據庫。NHibernate批量插入或更新

每個文件大約爲1Mb,包含大約1000條記錄;我們通常需要處理這些文件中的12到25個。我已經看到關於使用NHibernate批量插入的一些信息,但是我們的問題在某種程度上更復雜,因爲xml文件包含與更新記錄混合的新記錄。

在xml中有一個標誌,告訴我們是一個特定的記錄是一個新的還是現有記錄的更新,但不是什麼信息發生了變化。 xml記錄不包含我們的數據庫標識符,但我們可以使用xml記錄中的標識符來唯一地定位我們數據庫中的記錄。

到目前爲止,我們的策略是確定當前記錄是插入還是更新,並基於該插入對數據庫執行插入或我們執行搜索,然後使用來自xml記錄的信息,最後我們會對數據庫進行更新。

我們目前的方法存在的問題是,我們遇到了數據庫鎖的問題,而且我們的性能降低得非常快。我們已經考慮過一些替代方案,比如爲不同的業務分開表格,甚至分開數據庫,但做這樣的舉動意味着需要付出很大的努力,所以在做出任何決定之前,我要先徵求社羣的意見。

回答

17

一對夫婦的想法:

  • 始終嘗試使用IStatelessSession進行批量操作。
  • 如果你還是不滿意的表現,只是跳過NHibernate和使用特定於該存儲過程或參數化查詢,或者使用IQuery.ExecuteUpdate()
  • 如果您正在使用SQL Server,你可以在你的XML格式轉換爲BCPFORMAT xml然後在其上運行BULK INSERT(僅用於插入)
  • 如果您擁有太多的數據庫鎖,請嘗試對操作進行分組(即首先找出需要插入的內容和更新內容,然後獲取更新的PK ,然後運行BULK INSERT進行插入,然後運行更新)
  • 如果解析源文件是一個性能問題(即它最大化了一個CPU內核),請嘗試並行執行(可以使用Parallel Extensions