c# - tiempo - nHibernate sesión y multihilo
metodos de hilos c# (2)
Tenía un método con muchas llamadas de persistencia que usaban una sesión nHibernate, funcionó, estaba bien. Pero necesitaba refactorizar este método, extrayendo un método de un contenido dentro de un bucle, por razones de subprocesamiento múltiple. Luego creé una clase con este método. Es como una refactorización normal, pero la sesión nHibernate dentro de esta llamada a método está rota, sin contexto, no la finalicé en ningún momento. Tiene problemas nHibernate con multihilo? Incluso cuando solo tengo un hilo más ejecutándose, tengo el mismo problema.
Utilizo nHibernate Session a través de un patrón SessionFactory y Fachada, es decir, la sesión no es un campo de estos objetos, es global en SessionFactory.
Haciéndolo un poco más claro:
ANTES DE:
Method()
{
... persistence calls
foreach(Thing..)
{
...persistence calls for each thing (1)
}
...
}
DESPUÉS:
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
}
Nuestra nHibernate Session Factory es consciente de los subprocesos y almacena / recupera sesiones de nHibernate por subproceso. Está funcionando bien ahora;)
Puede tener una NHibernate SessionFactory para varios subprocesos siempre que tenga una sesión NHibernate por separado para cada subproceso.
Aquí hay un ejemplo que dará excepciones porque usa la misma sesión para cada hilo:
https://forum.hibernate.org/viewtopic.php?p=2373236&sid=db537baa5a57e3968abdda5cceec2a24
La solución es almacenar sesiones en LocaldataStoreSlot, de esa manera puede tener un modelo de sesión por solicitud.
Las sesiones no son seguras para hilos en NHibernate por diseño . Por lo tanto, debería estar bien siempre que tenga una sesión usada por solo un hilo .
No estoy seguro de qué es lo que hace Resolver, pero si hace algunas llamadas de persistencia en la misma sesión que ha creado en el hilo de origen; esta es probablemente la causa de sus problemas, podría crear una sesión separada en su nuevo hilo para que sea una sesión por hilo si mi suposición es verdadera.
La referencia de NHibernate lo tiene en la sección 10.2