Se debería hacer un try {} catch() cada vez que que se haga una consulta
para limpiar la session, pero eso se debería hacer en :public static void Application_EndRequest(object sender, EventArgs e) *---------------------------------------------------* *NhibernateProfiler me dice:* * * System.Data.SqlClient.SqlException (0x80131904): No se permite iniciar la nueva solicitud porque debe llegar con un descriptor de transacción válido. 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.SqlDataReader.ConsumeMetaData() en System.Data.SqlClient.SqlDataReader.get_MetaData() en System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) en System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) en System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) en System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) en System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() en NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) en NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) El 30 de agosto de 2010 18:04, Maria Teresa Ruiz Espinosa < [email protected]> escribió: > Nosotros interactuamos también con dlls de COM en las cuales se establecen > conexiones con la base de datos. > > No se si por ahí vendrán los problemas. > > Pero la conexión con la base de datos con nhibernate sólo se hace desde lo > que te he indicado anteriormente. > > Este es nuestro hibernate.cfg.xml > > <?xml version="1.0" encoding="utf-8" ?> > <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> > <session-factory> > <property > name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, > NHibernate.ByteCode.LinFu</property> > <property > name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> > <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> > <property > name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> > > <property name="show_sql">true</property> > <property name="connection.isolation">ReadCommitted</property> > </session-factory> > </hibernate-configuration> > > El 30 de agosto de 2010 17:44, José F. Romaniello > <[email protected]>escribió: > > muy bien, entonces no es por ese lado... >> puede ser que le estes asignando un dbconnection por tu cuenta a la >> session/sessionfactory ? >> >> El 30 de agosto de 2010 12:39, Maria Teresa Ruiz Espinosa < >> [email protected]> escribió: >> >>> >>> >>> 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 >>> >> >> -- >> 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
