第一,你要知道,並行線程會有一個蛋疼的地方。他不會每次執行都給你去開一個線程。 我一開始以為每次執行都會去開一個新的線程。。。。 result 這就導致,如果我們在當前線程上下文綁定了sessionFactory就會導致,重用線程會獲取到一樣的session 如果在前面一個線程中我們關閉了sessi ...
第一,你要知道,並行線程會有一個蛋疼的地方。他不會每次執行都給你去開一個線程。
我一開始以為每次執行都會去開一個新的線程。。。。
list.AsParallel().ForAll(memberInfo =>
{
Console.WriteLine(Thread.GetCurrentProcessorId());
}
result
這就導致,如果我們在當前線程上下文綁定了sessionFactory就會導致,重用線程會獲取到一樣的session
如果在前面一個線程中我們關閉了session 就會導致後來獲取到的session失效。
第一個, 我們首先去配置 SessionFactory
NHibernate.Cfg.Configuration的實例化對象Configuration
設置SessionFactory的配置屬性
Configuration.SetProperty("current_session_context_class", "thread_static"); //每個線程獲取到的session是不一樣的。
然後更改獲取session的方法
當然要在方法外部設置一個靜態的session 並且要帶上線程靜態的標簽,那麼每個線程獲取的去獲取的時候是原來的那一個,這就涉及到關閉了
[ThreadStatic] private static ISession Session; public ISession OpenCurrentSession() { try { if(CurrentSessionContext.HasBind(SessionFactory)) { Session = SessionFactory.GetCurrentSession(); } else { Session = SessionFactory.OpenSession(); CurrentSessionContext.Bind(Session); } return Session; } catch { throw; } }
關閉session方法
public void CloseCurrentSession() { try { //一定要線程上下文解綁 否則重用線程將會取到已經關閉的session CurrentSessionContext.Unbind(Session.SessionFactory); Session.Close(); Session.Dispose(); } catch { throw; } }
//至於查詢方法 ,你可以把你的sessionFactory使用 單例,
然後重ioc容器中去取
list.AsParallel().ForAll(memberInfo => { Console.WriteLine(Thread.GetCurrentProcessorId()); var session = appSessionFactory.OpenCurrentSession(); //這裡進行查詢 我不建議在這裡取使用更新刪除插入操作,很容易出問題 appSessionFactory.CloseCurrentSession(); });
這個並行線程使用session 就差不多完了。
一般用於多個去做一件事的時候可以用到並行線程,比如我需要集合中的每個元素都要去查資料庫,如果用for迴圈,會非常慢,如果用並行,將會非常快。