c# - Eficiencia de NHibernate
performance (7)
Al haberme quedado atrás en el mundo de ORM y el acceso a datos modernos, estoy buscando alejarme de DataSets ( estremecimiento ) y convertirme en un marco de mapeo adecuado.
Ya me he familiarizado con Linq en SQL, y ahora estoy investigando a NHibernate con miras a utilizarlo en nuestro próximo proyecto.
Con los juegos sql y de datos de la vieja escuela, sus consultas sql obviamente solo devuelven los datos que desea. También entiendo que L2S también es lo suficientemente inteligente como para evaluar sus cláusulas where para que solo devuelva los objetos que solicitó. ¿NHibernate es lo mismo? ¿Y es lo mismo con Ayende''s Linq a NHibernate?
Con esto quiero decir, si hago el equivalente de:
Select * from customers where name = "fred"
¿Traerá a cada cliente a la memoria, y luego filtrará los que no son freds, o es lo suficientemente inteligente como para obtener solo lo que necesita en primer lugar?
Si es inteligente, ¿cuáles son las advertencias? ¿Hay algún tipo de consulta que no se puede evaluar de esta manera? ¿Qué problemas de rendimiento debo tener en cuenta?
Gracias
Andrés
Nhibernate viene con un par de formas diferentes de consultar la base de datos. Hibernate usa una sintaxis similar a Sql llamada HQL, que es SQL en objetos. También puede hacer una búsqueda por ejemplo, donde crea un objeto y rellena el criterio que desea, luego hibernate extraerá el objeto del DB que tiene los mismos valores de propiedad.
echa un vistazo aquí te ayudará a acelerar el verano de Nhibernate lession 2 y 2a responderá con más profundidad
HTH
huesos
Si realmente está preocupado por las consultas que genera NHibernate, ejecute el Analizador de SQL Server y descubra qué se está ejecutando o configure su registro y active su salida de SQL. Mostrará todas las declaraciones SQL a donde configura su log4net.
Una respuesta rápida es que el ORM verificará el nombre de la propiedad y lo transformará en una consulta SQL que le dará nombre = ... Por lo tanto, no cargará todos los clientes en la memoria para buscar el nombre.
NHibernate creará una consulta similar a su ejemplo, ya sea que use HQL o la ICriteria, pero en realidad le hará una mejor idea. Creará una instrucción sql parametrizada para que la consulta se almacene en caché en SQL Server.
El ICriteria es extremadamente flexible, sin embargo, hay una pequeña curva de aprendizaje para dominarlo. Yo también recomiendo el verano de screencasts de nhibernate para ponerme al día rápidamente.
El desarrollo de Linq a SQL se ha descartado para Linq a Entidades. Deberías intentarlo también.
Sí, NHibernate debería ser uno de los ORM más eficaces que había utilizado en un proyecto y fue genial. Acerca de LINQ a NHibernate es posible que desee comprobar este artículo . Hay una curva de aprendizaje (NHQL e ICriteria) y si quieres hacer el salto va a ser difícil al principio, pero luego todo el tiempo invertido vuelve a ti. Espero que esto ayude.
Es algo simple lograr un rendimiento de clase "empresarial" con NHibernate.
En función de los mapeos de propiedad y relación en el objeto, el ORM generará una consulta específica para esa búsqueda. Si una propiedad se marca como carga diferida, se excluirá y cuando se acceda a la propiedad dentro de la sesión, una recuperación posterior obtendrá solo esa parte de datos faltantes. Entonces, si tuviéramos que activar el generador de perfiles SQL, la consulta traducida querría algo como esto
Select cust.Address, cust.Email from customers cust where cust.Name = "fred"
También es importante la profundidad de su consulta. Podemos limitar el número de registros que se devuelven (importante para grandes conjuntos de datos) mediante el uso de consultas HQL que colocan los datos en función de su proveedor de base de datos ... siempre que trabajen con el analizador HQL. También puede establecer FetchMode
o CollectionFetchMode
en las asignaciones de relaciones que realizarán combinaciones para seleccionar de varias tablas en una sola interacción.
Si está utilizando el servidor SQL, puede activar sp_execsql que ejecutará todas las búsquedas a través de un proceso almacenado para un aumento rápido del rendimiento.
Para obtener más información, hay un excelente artículo sobre Code Project que proporciona detalles sobre cómo mejorar el rendimiento de NHibernate en su aplicación. Si está utilizando una arquitectura orientada a servicios, la latencia puede ser una gran preocupación. Mira este hilo para más detalles sobre eso.