开发者

NHibernate Session access thru multiple threads

开发者 https://www.devze.com 2023-04-12 07:01 出处:网络
I am writing an application and I finally have it saving to the database correctly. 开发者_C百科 However, I have a few problems and was wandering if someone could help point me in the right direction.

I am writing an application and I finally have it saving to the database correctly. 开发者_C百科 However, I have a few problems and was wandering if someone could help point me in the right direction.

During my application load I fire off an NHibernate initialization thread that initializes NHibernate and then fires off 3 separate threads to load 3 of my objects, in order to split up and optimize the load time.

I was originally creating a temporary session in each of these threads in order to query the objects from the database; however, I was running into problems accessing one of the collections of my object saying that a session is not open or it has been closed. I have a static session that is globally accessible throughout my Windows application and when it was calling the GetEnumerator for the collection the state of this session was still open.

I believe it has to do with the fact that the Intersection, the class in question, was loaded from a different session in the thread during the init process. Loading all the objects form the same session works fine; however, I do run into exceptions from time to time with errors regarding sessions being used in a non thread safe manner.

My question then is this. Is there a way to "merge" sessions onto my global session? What can I do to set the Intersection class to where it has an open session in order to load the collection? Is the problem that I need to open the session of the static global program session in the main thread? Or am I going to be unable to thread the loading of the 3 different classes during my init process into 3 separate threads?


you can associate the object-graphs loaded with the other sessions with you main-session.

  • If the objects may have changed then MainSession.Merge(obj) because it will load the Db-State to know what changed.

  • If the objects haven't changed then MainSession.Lock(obj, LockMode.None) is enough to associate it with the main-session.

After that you you can use the objects as if they were loaded with your main session

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号