Como suponía, aquí está tu problema:
 using (ISession sesion = cfg.BuildSessionFactory
().OpenSession())

Estás creando un SessionFactory cada vez que usas una session y eso es
incorrecto. Sólo debes crear una SessionFactory para toda la aplicación, por
que es un objeto de alto coste en recursos (como estás pudiendo comprobar),
el objeto session es el objeto que se debe solicitar al único SessionFactory
de la aplicación por cada unit of work.

El 23 de enero de 2009 10:39, Plugin <[email protected]> escribió:

>
> Muchas gracias por las prontas respuestas.
> Conozco el hecho de que el GC no actúa cuando se hace el Dispose, pero
> para "forzar la situación"
> he hecho GC.Collect , ya un poco a la desesperada.
> Y aun así, el uso de la memoria, aumenta con una nueva sesión y no se
> recupera.
> Para identificar el problema he pasado por alto los asuntos
> arquitectónicos, y he creado un test que hace:
>
>  NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration
> ();
>  cfg.Configure();
>
>  for (int i = 0; i < 10; i++)
>  {
>             using (ISession sesion = cfg.BuildSessionFactory
> ().OpenSession())
>                {
>                    Sector sector = (Sector)sesion.Load(typeof
> (SectorImpl), (Int16)10);
>                }
>
>            }
>
> GC.Collect();
>
> Lo he ejecutado cada 2 minutos (para simular un entorno de producción
> real, como me aconsejaba Gustavo, que por cierto,muy bueno símiles)
>
> De nuevo, gracias.
>
>
> On 23 ene, 10:03, Gustavo Ringel <[email protected]> wrote:
> > Francisco por supuesto que tenes razon en un punto de vista teorico, pero
> en
> > la practica el GC de C# solo recolecta memoria cuando hace allocation.
> >
> > Ver por ejemplo esto:
> http://blogs.msdn.com/tess/archive/2007/04/10/net-garbage-collector-p...
> >
> > *If we exclude GC.Collect calls, this means that a GC will only occur on
> > allocation.  I have mentioned this before, but I think it is worth
> > mentioning again... a classic mistake to make is to run a stress test and
> > then come back 10 mins after the stress test and wonder why memory is not
> > being released.  In other words, objects may well be ready to be released
> > but no allocations are made, meaning no GCs will occur, so memory usage
> will
> > stay flat.
> > *
> > Gustavo.
> >
> > 2009/1/23 Francisco A. Lozano <[email protected]>
> >
> > > Si el GC no elimina esos objetos de la memoria es porque mantienes
> > > referencias a los mismos, simple y llanamente, por mucho dispose que
> > > hagas.
> >
> > > Francisco A. Lozano
> >
> > > 2009/1/23 Plugin <[email protected]>:
> >
> > > > Saludos a todos.
> >
> > > > En primer lugar debo agradeceros vuestra dedicación y consejo, que en
> > > > más de una situación delicada me han salvado.
> >
> > > > La cuestión que quiero plantear es la siguiente:
> > > > Hemos puesto en marcha una aplicación ASP.Net que emplea NHibernate.
> >
> > > > Para la gestión de las sesiones, hemos usado el "Command Pattern", de
> > > > forma que cada caso de uso
> > > > se enmarca en una apertura/cierre de sesión. (de forma similar a como
> > > > se hace en el Session per view )
> >
> > > > Ahora bien. Lo que hemos observado es que al hacer un Close o un
> > > > Dispose de la sesión, el GC hace caso omiso, y la memoria no se está
> > > > recuperando, de modo que tras hacer uso varios usuarios de la
> > > > aplicación, se produce una OutOfMemoryException...
> >
> > > > He probado a hacer un test de stress haciendo apertura/cierre/dispose
> > > > de sesiones, recuperando un objeto, y he comprobado que
> efectivamente,
> > > > el uso de memoria crece, crece....
> >
> > > > Dónde puede estar el problema?
> > > > Hay algo que no entendí bien?
> >
> > > > Un saludo.
> >
> >
> >
>


-- 

=================================
Sergio Castillo Checa

--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---

Responder a