簡體   English   中英

nHibernate會話和多線程

[英]nHibernate session and multithreading

我有一個方法,有很多持久性調用使用nHibernate會話,它工作,沒關系。 但是出於多線程的原因,我需要重構這個方法,從循環內的內容中提取方法。 然后我用這個方法創建了一個類。 它就像一個正常的重構,但是這個方法調用中的nHibernate會話被破壞了,沒有上下文,我沒有隨時完成它。 多線程有nHibernate問題嗎? 即使我只有一個線程正在執行,我也有同樣的問題。

我通過SessionFactory和Façade模式使用nHibernate Session,這意味着,會話不是這些對象的字段,它在SessionFactory是全局的。


讓它更清楚一點:

之前:

Method()
{
... persistence calls
foreach(Thing..)
{
...persistence calls for each thing (1)
}
...
}

后:

Method()
{
... persistence calls
foreach(Thing..)
{
create a thingResolver object with some data
open a new thread with thingResolver.Method (1)
starts this thread
}
.. waits for finishing threads and continues
}

我們的nHibernate會話工廠是線程感知的,並且每個線程存儲/檢索nHibernate會話。 它現在很好用;)

通過設計,會話在NHibernate中不是線程安全的 所以只要你只有一個線程使用會話就應該沒問題。

我不確定你是什么東西,但是如果你在原始線程中創建的同一個會話中有一些持久性調用 - 這很可能是你的問題的原因,你可以在你的新創建一個單獨的會話如果我的假設是真的,那么它將成為每個線程的一個會話。

NHibernate參考在10.2節中有它

http://nhibernate.info/doc/nh/en/index.html#transactions

只要每個線程都有一個單獨的NHibernate會話,就可以為多個線程創建一個NHibernate SessionFactory。

這是一個示例,它將提供異常,因為它為每個線程使用相同的會話:

https://forum.hibernate.org/viewtopic.php?p=2373236&sid=db537baa5a57e3968abdda5cceec2a24

解決方案是在LocaldataStoreSlot上存儲會話,這樣您就可以擁有每個請求的會話模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM