2010-11-17 37 views
0

我在這裏有一個奇怪的。 我正在使用nhibernate,我的問題是,在較大的數據插入時,不會拋出任何異常,表中沒有數據,但身份關鍵字已被佔用。所以當我手動插入下一條記錄時,身份密鑰會跳過一些數據,就像數據被導入並刪除一樣?!?!nHibernate數據插入問題/神祕

這裏有一些事情要考慮: - 我從Web服務獲取數據,因此每個項目需要一段時間,它被調用之前再接再厲 - 根據它或者是插入或更新的項目 - 我使用foreach遍歷獲取的集合,然後檢查它是否更新或插入(即,我嘗試填充實體或創建新實例,然後在最後調用make persistent。) - 代碼工作正常因爲數據在較小的批次上插入並在數據庫中可見。對於需要稍長一點的導入,它仍然沒有任何例外地完成,但沒有可見的數據,但只有線索是已被插入和可見的標識關鍵字佔用。

任何人都可以解釋這裏發生了什麼? 由於我沒有得到任何例外,我無法診斷這一點,任何幫助或建議非常感謝!

回答

0

帶IDENTITY的主鍵和回退事務將解釋缺失的鍵。他們被插入然後再被移除,要麼是因爲稍後的錯誤導致了回滾,要麼就像詹姆斯所說的那樣,事務超時。這是討論here

你真正的問題似乎是無聲的錯誤。你是否用一個空的捕獲來抑制異常?你的漁獲能否拋出它自己的例外?如果您還沒有,我建議使用簡單的文件appender(sink)將log4net添加到您的項目中。如果它存在的話,NHibernate會寫出它對log4net所做的一切(對於調試很有用,但不要在生產環境中使用)。或者,如已經建議的那樣,您可以分析您的SQL。

+0

謝謝你的回答,非常準確地回答。批處理被包裝在單個事務中,所以你對回滾的建議必須正是發生的事情。 實際上有一個異常被手動捕獲,並且是由於需要將實體驅逐出來才能進行下一次更新/插入。 非常感謝所有回覆您的朋友! – Sid 2010-11-20 16:11:52

0

關閉我的頭頂我無法想象會發生什麼。你有SQL分析器嗎?如果你這樣做,並且你可以持續地重現運行探查器的這個問題,而它發生時應該知道發生了什麼。如果沒有,你可能會寫入插入/刪除觸發器來跟蹤表中發生的事情。

0

你的PK代戰略是什麼? (知道這可能有助於解釋爲什麼PK已經用完了。)關閉我的頭頂,聽起來就像你的交易超時了。一些解決方法...

  • 通過hibernate.cfg.xml中的adonet.batch_size啓用更新批處理,假設您的數據庫提供程序支持它。 SQL Server和Oracle提供商肯定會這樣做。許多其他人不。
  • 從Web服務獲取所有數據,並且不要開始插入/更新對象,直到獲得所有數據。這將有助於保持您的數據庫事務更短,因爲您不會等待Web服務。
  • 如果您的業務邏輯允許,考慮將一個較大的批次拆分爲多個較小的批次。由於較小的批次正在工作,因此提交交易並每隔X個項目開始一個新交易可能是有意義的。