views:

2425

answers:

1

I had a method with a lot of persistence calls that used a nHibernate session, it worked, was alright. But I needed to refactor this method, extracting a method from a content inside a loop, for multithread reasons. Then I created an class with this method. It is like a normal refactoring, but the nHibernate session inside this method call is broken, without context, I didn't finalize it at any moment. Has nHibernate problems with multithreading? Even when I have only one more thread executing, I have the same problem.

I use nHibernate Session through a SessionFactory and Façade pattern, it means, the session is not a field of these objects, it is global at SessionFactory.


Making it a little bit more clear:

BEFORE:

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

AFTER:

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
}


Our nHibernate Session Factory is thread-aware, and stores/retrieves nHibernate session per thread. It is working nicely now ;)

+4  A: 

Sessions are not thread safe in NHibernate by design. So it should be ok as long as you have a session used by only one thread.

I'm not sure what you're thingResolver does, but if it does some persistance calls on the same session you've created in the originating thread - this most probably the cause of your problems, you could create a separate session in your new thread so that it would be a session per thread if my assumption is true.

NHibernate reference has it in section 10.2

http://nhforge.org/doc/nh/en/index.html#transactions

axk
thanks Aleksey. I will have problems to do it (work with another session), since it violates my design, I'm thinking about forgeting this multithread thing.
Victor Rodrigues
in fact, my session factory is robust and can mantain a session per thread, its working :D
Victor Rodrigues
Updated link to documentationhttp://nhforge.org/doc/nh/en/index.html#transactions
AlfeG