NHibernate StatelessSession: sin caché de primer nivel
En la próxima release de NHibernate estará disponible esta feature portada desde Hibernate por Fabio Maulo, los que deseen usarla en este momento deben hacerlo desde el trunk.
Qué hace? IStatelessSession es la interfaz que debemos usar para conseguir sesiones de NHibernate que no posean caché de primer nivel. Debemos recordar que la caché de primer nivel en ISession es obligatoria y siempre la usamos cuando trabajamos con NHibernate. Trabajar sin ella era imposible hasta ahora.
Para que sirve? Especialmente hecho para realizar operaciones en masa contra la base de datos.
Miremos este código:
using (ISessionFactory sf = cfg.BuildSessionFactory()) { using (IStatelessSession session = sf.OpenStatelessSession()) { using (ITransaction tx = session.BeginTransaction()) { Foo f = new Foo(); f.Id = 1; f.Misc = "m1"; f.Name = "n1"; session.Insert(f); f.Id = 2; session.Insert(f); tx.Commit(); Debug.Assert(session.CreateQuery("from Foo") .List().Count == 2); } } }
Como verán el objeto f fué creado 1 vez y mandado a persistir dos veces con el Id cambiado, primero con ’1′ y luego con ’2′. En un escenario común con caché de primer nivel esto no funcionaría, ya que NHibernate “recordaría” al objeto f desde que fué guardado por primera vez. Y como resultado en la base habrán 2 objetos guardados.
Notese también que al guardar el objeto realizamos un Insert en vez de un Save. Las inferzaces ISession e IStatelessSession no se relacionan para nada.
Para que este ejemplo funcione con cache de primer nivel es obligatorio hacer que NHibernate se “olvide” del objeto que acabamos de guardar llamando al metodo Evit(object) -método no disponible en IStatelessSession como podrán intuir. Y se vería así:
using (ISessionFactory sf = cfg.BuildSessionFactory()) { using (ISession session = sf.OpenSession()) { using (ITransaction tx = session.BeginTransaction()) { Foo f1 = new Foo(); f1.Id = 1; f1.Misc = "m1"; f1.Name = "n1"; session.Save(f1); //Eliminamos el objeto de la cache session.Evict(f1); f1.Id = 2; session.Save(f1); tx.Commit(); Debug.Assert(session. CreateQuery("from Foo").List().Count == 2); } } }
Recursos:
One Response to NHibernate StatelessSession: sin caché de primer nivel
Leave a Reply Cancel reply
-
Categories
- .NET
- ActiveRecord
- agil
- Alt.Net
- AOP
- Asp.net MVC
- blog
- C#
- codegeneration
- cosas interesantes
- db4o
- db4o-analyzer
- DLR
- enterprise-library
- expresiones regulares
- General
- Hibernate
- IoC
- it
- Java
- LINQ
- Linux
- Lucene
- Mocking
- Mono
- monosms
- MVC
- NAnt
- NHibernate
- NHibernate.Burrow
- NHibernate.Contrib
- NHibernate.Validator
- noticias
- O/R Mapping
- Open Source
- patrones
- personal
- podcast
- programación
- Redes Neuronales
- Refactoring
- regex
- Scrum
- Security
- Shards
- Sin Categoría
- Spring
- SqlServer
- Testing
- tips
- Tool
- tutorial
- Ubuntu
- uNHAddIns
- video
- Virtualización
- Visual Basic.Net
- Visual Studio
- VMWare
- Web
-
Articles
- June 2011
- May 2011
- November 2009
- October 2009
- April 2009
- March 2009
- February 2009
- October 2008
- September 2008
- August 2008
- July 2008
- June 2008
- May 2008
- April 2008
- March 2008
- February 2008
- January 2008
- December 2007
- November 2007
- October 2007
- September 2007
- August 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- November 2006
- October 2006
- September 2006
- August 2006
- March 2006
- February 2006
- December 2005
- November 2005
- October 2005
-
Meta





Muy buen ejemplo, era lo que andaba buscando te pasaste. justo lo iba a preguntar en NHibernate Hispano.
Aparte de esto, no sabes que otra cosa puedo hacer para hacelerar una carga masiva de datos en NHibernate, con una programa de consola normal y la conexion normal a sql, al hacer un insert y 2 update 10000 veces, se demora aprox 1min, pero nhibernate sin statelessSesipon(SS) 17 min, y con SS 5 min. Igual hay diferencia.
Gracias por tu ayuda