2011-06-03 81 views
2

我想讓NH批量插入工作將一些舊數據遷移到我們的新數據庫。測試樣品我已經配置批量大小,像這樣:NHibernate批量插入不起作用

<property name="adonet.batch_size">25</property> 

,並在無狀態會話我插入提交事務之前一些1000的對象。對象ID策略是guid.comb,並按如下方式映射:

<id name="Id" access="field.camelcase-underscore" type="guid" column="id"> 
    <generator class="guid.comb"/> 
</id> 

使用NH事件探查器,我可以看到所有的物體插入作爲單獨的語句,而不是成批的,所有的人都非常喜歡看:

INSERT INTO Buddies 
     (id) 

VALUES( '81c7d3be-d718-45a4-86fe-9ef700b7ad55'/ * @ * P0_0 /)

可能是什麼原因,我應該怎麼做才能配料工作?

回答

1

嘗試看看這裏:

NHibernate 2.1.0.4000 doesn't seem to like batch insert

我認爲這是有用的太:

http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html

本文

,在最後一個例子,他用:

<id type="int"> 
    <generator class="identity"/> 
</id> 

這似乎是關鍵..有喲你試過了嗎?

+0

是的,我讀了這個問題,但問題是那裏生成的ID的使用,而我切換到guid.comb讓批處理工作,但無濟於事...... – 2011-06-03 08:21:30

+0

你也rad? http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html – danyolgiax 2011-06-03 08:25:13

+0

是的......我昨天讀到,似乎沒有說清爲什麼使用上述配置進行批處理不起作用... – 2011-06-03 08:45:53

1

插入批處理僅適用於Session,而不適用於StatelessSession。

無狀態插入即時。

+1

剛剛試過用OpenSession,BeginTransaction - CommitTransaction,CloseSession代替無狀態會話,但它仍然沒有批量插入NH profiler,這會觸發「大量單獨寫入」警報... – 2011-06-06 06:54:06

+1

嗯,我只是得到這個與不同類型的對象一起工作。看起來沒有爲示例對象執行批處理,因爲它是每個子類繼承的表中的祖先(連接子類)。有人知道你是否仍然可以批量插入這樣的對象嗎? – 2011-06-06 07:02:42

+0

@DimitarLichev:我不知道。我建議你用這個更具體的案例開一個新的問題。 – 2011-06-06 11:06:28

1

DML操作的配料可與無狀態的會話,但它具有相同的限制比全狀態會話配料,和一些額外的:

  • 它不能批量實體插入,而這些實體有-插入後檢索ID,像identity發生器。
  • 它不能批量插入,更新或刪除跨越多個表的實體。
  • 它可能無法使用樂觀鎖定。 (這裏有不同的情況,這取決於版本的生成方式。)
  • 此外,由於它是無狀態的,因此它不會嘗試重新組合相同的實體類操作以將它們批處理在一起。只要您開始另一個操作(通過示例從插入切換到更新)或者開始對另一種實體進行操作,則上一批將被刷新。因此,在使用無狀態會話進行操作時,如果操作不斷混合,則批處理確實不起作用。開發人員需要重新組合它們。

看到你的comment在另一個答案,你的實體跨越很多表。它不能成批。

這是關於它是如何工作的簡化和不完整的解釋。 DML batcher通過插入或更新或刪除命令來工作,併爲其值賦予參數。它將其與其參數值一起存儲。在它接收到的下一個命令中,它會檢查它是否與前一個匹配。如果是,則存儲其參數值。如果是另一個命令,則刷新前一批並存儲新命令。

這就是跨越多個表的實體無法被批處理的原因:它上面的每個操作都意味着許多命令,導致在每次操作時都會觸發批處理器。在插入非跨許多表的基本非抽象實體以及跨越多個表的後代實體的某些邊緣情況下,您可以目睹第一個後代實體的基表插入,以插入基礎實體進行批處理。但這是一個特例,實際上並不值得嘗試利用,因爲它僅適用於基本實體操作之後的第一個很多表實體,而不適用於後續操作。