nhibernate entity-framework domain-driven-design scale persistence-ignorance

nhibernate - ¿Puede Persistence Ignorance Scale?



entity-framework domain-driven-design (3)

He estado echando un vistazo breve a NHibernate y Linq2Sql. También tengo la intención de echar un vistazo a Entity Framework.

La pregunta que se plantea, cuando hablo de estos ORM es "No pueden escalar", ¿verdad? De Google me da la impresión de que pueden escalar bien, pero en última instancia, supongo que debe haber un precio que pagar. ¿Vale la pena pagar por una capa empresarial más sencilla y rica?


Esta es una buena pregunta, y en mi humilde opinión pueden escalar tan bien como cualquier DAL personalizado. Solo he usado nHibernate, así que me centraré solo en él y en las características que tiene, que pueden ayudar a escalar un sistema.

  • Carga diferida: como admite la carga diferida, puede evitar cargar cualquier elemento no escamoteado. Por supuesto, debe tener cuidado con el problema Select n + 1, pero hay cosas en el sistema para evitarlo.
  • Obtención con ansias: hay varias formas de buscar con impaciencia los objetos que pueda necesitar, lo que le permite evitar viajes adicionales a SQL.
  • Caché de segundo nivel: nHibernate tiene soporte para un caché de segundo nivel que se puede utilizar para aumentar la escalabilidad al reducir los viajes al DB. Hay varios proveedores de respaldo disponibles que le dan cierta flexibilidad.
  • Escriba su propio SQL: en nHibernate puede llamar a procedimientos almacenados o proporcionar la consulta SQL en línea que devolverá sus entidades. Esto le permitirá usar su propio SQL cuando el sql generado no lo corte. Por ejemplo, ansioso de cargar un árbol de auto unión utilizando una consulta recursiva.

Ahora dicho esto, creo que es más fácil modificar inicialmente una capa DAL personalizada porque eres íntimo con su construcción y puedes ajustarla; sin embargo, un buen ORM proporcionará muchos ganchos que le permitirán optimizar un poco. Solo necesitas pasar un tiempo aprendiéndolo.

También creo que si tienes un área de código de rendimiento crítico y no puedes lograr que tu ORM funcione dentro de tus requisitos, entonces para esa pequeña área de tu aplicación puedes crear tu propia capa de DAL. Si está utilizando un patrón de diseño decente, como un repositorio creado por una fábrica, todo lo que necesita hacer es cambiar la implementación de su repositorio


Hibernate Shards está siendo portado a NHibernate , lo que permitirá escalar horizontalmente.

También hay algunos hacks muy geniales como este para implementar sharding.

Entonces la respuesta es sí, NHibernate puede escalar, de una manera persistente, ignorante y completamente transparente.


Es simplemente incorrecto decir que las aplicaciones integradas en un ORM no se adaptan bien. Ciertamente, ha sucedido antes de que los desarrolladores descuidados o perezosos abusen de un ORM al escribir código que genera SQL horriblemente ineficiente. Desarrollar aplicaciones de alto rendimiento significa entender algo acerca de lo que realmente hacen las encantadoras abstracciones bajo el capó. Sin embargo, no se necesita mucho para mantenerse fuera de esta trampa. Usar un ORM no significa nunca abrir el perfilador SQL o NHibernate Profiler .

Y con respecto a la afirmación de que los SP son mucho más rápidos, lea esto y esto . Y además, los ORM (al menos NHibernate) le dan formas bastante sencillas de usar SP si alguna vez lo necesita.