La session que se usa es diferente para cada petición
Te enseño como lo tenemos configurado
public class HttpContextSessionStorage: ISessionStorage
{
const string CLAVE_SESIONES = "NHibernate.Session.Keys";
public HttpContextSessionStorage()
{
}
public HttpContextSessionStorage(HttpApplication httpApp)
{
if (httpApp != null)
{
httpApp.BeginRequest += Application_BeginRequest;
httpApp.EndRequest += Application_EndRequest;
}
}
public static void Application_BeginRequest(object sender, EventArgs
e)
{
HttpContext.Current.Items[CLAVE_SESIONES] = new
Dictionary<string, ISession>();
}
public static void Application_EndRequest(object sender, EventArgs
e)
{
var sesionesActivas =
HttpContext.Current.Items.Contains(CLAVE_SESIONES) ?
HttpContext.Current.Items[CLAVE_SESIONES] : null;
if (sesionesActivas != null)
{
foreach (var session in ((IDictionary<string,
ISession>)sesionesActivas).Values)
{
if (session.Transaction != null &&
session.Transaction.IsActive)
{
try
{
session.Transaction.Commit();
}
catch
{
session.Transaction.Rollback();
}
}
session.Close();
}
}
}
public void SetSession(string database, ISession session)
{
var sessions = (IDictionary<string, ISession>)
HttpContext.Current.Items[CLAVE_SESIONES];
sessions[database] = session;
}
public ISession Session(string database)
{
var sessions = (IDictionary<string,
ISession>)HttpContext.Current.Items[CLAVE_SESIONES];
ISession session;
sessions.TryGetValue(database, out session);
return session;
}
}
//NHbinernateSession
public static class NHibernateSession
{
static readonly IDictionary<string, ISessionFactory> _sessionFactory
= new Dictionary<string, ISessionFactory>();
// Lo convierto en propiedad porque necesitamos cambiarlo en el
transcurso de la inicialización de la aplicación:
public static ISessionStorage SessionStorage { get; set; }
public static void Init(ISessionStorage sessionStorage,
IConfiguracionBD configuracionBD, Assembly assembly)
{
SessionStorage = sessionStorage;
foreach (var conexion in configuracionBD.ListaDatosConexion)
{
var configuracionSessionFactory = new Configuration();
configuracionSessionFactory.SetProperty("connection.connection_string",
conexion.DameConnectionString());
configuracionSessionFactory.Configure();
configuracionSessionFactory.AddAssembly(assembly);
_sessionFactory[conexion.NombreConexion] =
configuracionSessionFactory.BuildSessionFactory();
}
}
public static ISession Session(string database)
{
if (SessionStorage == null)
{
throw new Exception("NHibernateSession no está inicializado.
Llama a Init antes de operar con él. Comprueba también que haya un
ISessionStorage asociado a NHibernate.");
}
ISession session = SessionStorage.Session(database);
if (session == null)
{
session = _sessionFactory[database].OpenSession();
session.FlushMode = FlushMode.Commit;
SessionStorage.SetSession(database, session);
}
return session;
}
}
El 30 de agosto de 2010 17:27, José F. Romaniello
<[email protected]>escribió:
> Hola María Teresa, me gustaría saber que hay dentro de esta línea:
>
>> var session = NHibernateSession.Session(NHibernateSession.BBDD_OFITOUR);
>
>
> Bajo ningún punto de vista deberías usar la misma session, desde diferentes
> threads, y creo que viene por ahí tu problema.
>
> El 30 de agosto de 2010 12:18, Maria Teresa Ruiz Espinosa <
> [email protected]> escribió:
>
>> Este error también nos da
>>
>> System.Data.SqlClient.SqlException: No se permite una nueva transacción
>> porque hay otros subprocesos en ejecución en la sesión.
>>
>> NHibernate.TransactionException: Begin failed with SQL exception --->
>> System.Data.SqlClient.SqlException: No se permite una nueva transacción
>> porque hay otros subprocesos en ejecución en la sesión.
>> en System.Data.SqlClient.SqlConnection.OnError(SqlException exception,
>> Boolean breakConnection)
>> en System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
>> exception, Boolean breakConnection)
>> en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
>> en System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,
>> SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet
>> bulkCopyHandler, TdsParserStateObject stateObj)
>> en
>> System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[]
>> buffer, TransactionManagerRequestType request, String transactionName,
>> TransactionManagerIsolationLevel isoLevel, Int32 timeout,
>> SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean
>> isDelegateControlRequest)
>> en
>> System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest
>> transactionRequest, String transactionName, IsolationLevel iso,
>> SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
>> en
>> System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest
>> transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction
>> internalTransaction, Boolean isDelegateControlRequest)
>> en
>> System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel
>> iso, String transactionName)
>> en
>> System.Data.SqlClient.SqlInternalConnection.BeginTransaction(IsolationLevel
>> iso)
>> en System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel
>> isolationLevel)
>> en
>> System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction(IsolationLevel
>> isolationLevel)
>> en NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel
>> isolationLevel)
>> --- Fin del seguimiento de la pila de la excepción interna ---
>> en NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel
>> isolationLevel)
>> en NHibernate.Transaction.AdoTransaction.Begin()
>> en NHibernate.Impl.SessionImpl.BeginTransaction()
>> en
>> Ofi.OfiTourWeb.Repository.Consultas.ConsultaExpedientesUsuario.DameExpediente(String
>> idExpediente) en
>> C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Repository\Consultas\ConsultaExpedientesUsuario.cs:línea
>> 228
>> en Ofi.OfiTourWeb.Repository.RepositorioReservas.DameExpediente(String
>> idExpediente) en
>> C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Repository\RepositorioReservas.cs:línea
>> 54
>> en Ofi.OfiTourWeb.Core.Services.ServicioReservas.DameExpediente(String
>> idExpediente) en
>> C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Core\Services\ServicioReservas.cs:línea
>> 99
>> en
>> Ofi.OfiTourWeb.Web.Controllers.ReservasController.MuestraResumenReservaMail(String
>> id) en
>> C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Web\Controllers\ReservasController.cs:línea
>> 272
>> en lambda_method(Closure , ControllerBase , Object[] )
>> en System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase
>> controller, Object[] parameters)
>> en System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext
>> controllerContext, IDictionary`2 parameters)
>> en
>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext
>> controllerContext, ActionDescriptor actionDescriptor, IDictionary`2
>> parameters)
>> en
>> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
>> en
>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter
>> filter, ActionExecutingContext preContext, Func`1 continuation)
>> en
>> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c()
>> en
>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext
>> controllerContext, IList`1 filters, ActionDescriptor actionDescriptor,
>> IDictionary`2 parameters)
>> en System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext
>> controllerContext, String actionName)
>> en System.Web.Mvc.Controller.ExecuteCore()
>> en System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
>> en
>> System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext
>> requestContext)
>> en
>> System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4()
>> en
>> System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
>> en
>> System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult
>> _)
>> en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
>> en System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
>> en
>> System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult
>> result)
>> en
>> System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
>> en System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&
>> completedSynchronously)
>>
>>
>> El 30 de agosto de 2010 16:50, NM <[email protected]> escribió:
>>
>> Buenas ya escribi anteriormente con problemas con nhibernate
>>>
>>> Esta función de vez en cuando me da el errro que se especifica debajo
>>>
>>> var session =
>>> NHibernateSession.Session(NHibernateSession.BBDD_OFITOUR);
>>> using (var transaction = session.BeginTransaction())
>>> {
>>> usuario = session
>>> .CreateQuery(@"
>>> from NhUsuarioWeb U
>>> inner join fetch U.NivelAcceso
>>> inner join fetch U.Oficina O
>>> inner join fetch O.TipoClienteEstadistica
>>> inner join fetch U.Agente
>>> where U.UsuarioWeb = :login AND
>>> U.AccesoPermitido = 'S'")
>>> .SetParameter("login", login)
>>> .SetResultTransformer(new
>>> RepositorioDtoUsuarioLoginTransformer())
>>> .UniqueResult<Usuario>();
>>>
>>> transaction.Commit();
>>> }
>>>
>>>
>>> System.InvalidOperationException:
>>> Ya hay un DataReader abierto asociado a este Command, debe cerrarlo
>>> primero.
>>>
>>> NHibernate.TransactionException: Begin failed with SQL exception --->
>>> System.InvalidOperationException: Ya hay un DataReader abierto
>>> asociado a este Command, debe cerrarlo primero.
>>> en
>>>
>>> System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand
>>> command)
>>> en
>>>
>>> System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel
>>> iso, String transactionName)
>>> en
>>>
>>> System.Data.SqlClient.SqlInternalConnection.BeginTransaction(IsolationLevel
>>> iso)
>>> en
>>> System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel
>>> isolationLevel)
>>> en
>>>
>>> System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction(IsolationLevel
>>> isolationLevel)
>>> en NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel
>>> isolationLevel)
>>> --- Fin del seguimiento de la pila de la excepción interna ---
>>> en NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel
>>> isolationLevel)
>>> en NHibernate.Transaction.AdoTransaction.Begin()
>>> en NHibernate.Impl.SessionImpl.BeginTransaction()
>>> en
>>>
>>> Ofi.OfiTourWeb.Repository.RepositorioUsuarioNh.DameDtoUsuarioLoginPorLogin(String
>>> login) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Repository
>>> \RepositorioUsuarioNh.cs:línea 52
>>> en
>>>
>>> Ofi.OfiTourWeb.Repository.RepositorioUsuario.DameDtoUsuarioLoginPorLogin(String
>>> login) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Repository
>>> \RepositorioUsuario.cs:línea 36
>>> en
>>>
>>> Ofi.OfiTourWeb.Core.Services.ServicioLoginUsuario.DameUsuarioPorLogin(String
>>> loginUsuario) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Core\Services
>>> \ServicioLoginUsuario.cs:línea 115
>>> en
>>>
>>> Ofi.OfiTourWeb.Web.Controllers.BuscarController.RellenaFiltroBusquedaConDatosUsuario(FiltroBusqueda
>>> filtroBusqueda) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Web
>>> \Controllers\BuscarController.cs:línea 103
>>> en
>>>
>>> Ofi.OfiTourWeb.Web.Controllers.BuscarController.ProcesarBusqueda(FiltroBusqueda
>>> filtroBusqueda) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Web
>>> \Controllers\BuscarController.cs:línea 119
>>> en
>>>
>>> Ofi.OfiTourWeb.Web.Controllers.BuscarController.Estancias(FiltroBusquedaEstancias
>>> filtroBusquedaEstancias) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Web
>>> \Controllers\BuscarController.cs:línea 30
>>> en lambda_method(Closure , ControllerBase , Object[] )
>>> en System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase
>>> controller, Object[] parameters)
>>> en
>>> System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext
>>> controllerContext, IDictionary`2 parameters)
>>> en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext
>>> controllerContext, ActionDescriptor actionDescriptor, IDictionary`2
>>> parameters)
>>> en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
>>> en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter
>>> filter, ActionExecutingContext preContext, Func`1 continuation)
>>> en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c()
>>> en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext
>>> controllerContext, IList`1 filters, ActionDescriptor actionDescriptor,
>>> IDictionary`2 parameters)
>>> en
>>> System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext
>>> controllerContext, String actionName)
>>> en System.Web.Mvc.Controller.ExecuteCore()
>>> en System.Web.Mvc.ControllerBase.Execute(RequestContext
>>> requestContext)
>>> en
>>>
>>> System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext
>>> requestContext)
>>> en
>>> System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4()
>>> en
>>>
>>> System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
>>> en
>>>
>>> System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult
>>> _)
>>> en
>>> System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
>>> en System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult
>>> asyncResult)
>>> en
>>>
>>> System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult
>>> result)
>>> en
>>>
>>> System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
>>> en System.Web.HttpApplication.ExecuteStep(IExecutionStep step,
>>> Boolean& completedSynchronously)
>>>
>>>
>>> Por favor necesito solucionar este problema ya, pero no encuentro la
>>> forma.
>>>
>>> --
>>> Para escribir al Grupo, hágalo a esta dirección:
>>> [email protected]
>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>
>>
>> --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>
--
Para escribir al Grupo, hágalo a esta dirección:
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano