2011-01-04 11 views
5

Esto está relacionado con a previous question I asked, con respecto a dividiendo una aplicación web asp.net mvc en dos aplicaciones: una pública y una administrativa. Ambos compartirían la misma base de datos, por supuesto.NHibernate: dos SessionFactories que acceden a la misma base de datos

Con dos aplicaciones web, tendré dos aplicaciones host y, por lo tanto, dos fábricas de sesión independientes de Nihbernate. Mi preocupación es que sus cachés de datos separados causarán todo tipo de problemas.

Al publicar esto, miré this question, que cubre un problema similar (por un motivo diferente). Realmente no quiero tener que configurar algún tipo de caché distribuida solo para una aplicación de administrador de bajo uso.

¿Cómo se puede resolver esto? ¿No es posible separar la sección de administración en su propia aplicación con NHibernate sin medidas drásticas?

Gracias.

+0

La solución depende de lo que quiere decir con "cachés de datos". Creo que te refieres a uno de los proveedores de caché de segundo nivel? – Paco

+0

@Paco - eso es correcto. – UpTheCreek

Respuesta

1

Ejecutamos esto con éxito aunque algunas discrepancias en los datos siempre son un problema. Sin embargo, dado que el caché de segundo nivel es configurable por sitio, puede deshabilitarlo y desactivarlo para áreas de caché específicas en su administrador.

El segundo nivel de caché solo se utilizará para la lectura, ya que las actualizaciones explícitas se eliminarán y se conservarán directamente.

Si le preocupa que el contenido en el sitio será "viejo" una vez modificado, se necesitará algún tipo de activador para indicarle al sitio que desaloje el caché. NHibernate desalojará todo el caché de segundo nivel para un tipo de entidad específica si lo recuerdo correctamente.

Creo que su problema con la concurrencia será mínimo si su sitio vs su administrador actualizará diferentes entidades. Por ejemplo, en una tienda online:

Site will create orders, modify customers etc but only read products, prices and categories 

Admin will modify orders, products, prices and categories but only read customers 

Sin embargo, puede instruir a NHibernate única actualización modificada campos/propiedades en los objetos para las entidades que le preocupan los problemas de concurrencia con dynamic-update = "true" en el mapeo. Esto no resolverá completamente su problema, pero minimizará los problemas de concurrencia.

0

En primer lugar, debe saber que NHibernate doesn't enable second-level cache by default.

Así que, en realidad usted no necesita siquiera las medidas adicionales para completar a la memoria caché solo de no uso Distribuido. Simplemente use su ISessionFactory "Admin" y no habilite ningún caché L2 para eso.

Podría ser un tipo de problema dentro de una única aplicación/fábrica pero ya resolvió ese problema dividiéndolo en 2 aplicaciones físicas diferentes.

+0

Gracias. Pero, ¿por qué sería un problema dentro de una sola fábrica? Seguramente este problema se debe precisamente a que ** no ** estamos usando una sola fábrica de sesiones? Además, con respecto a la memoria caché de segundo nivel, incluso si solo se usa en el sitio público, y se dejó desactivado en el sitio de administración, esto todavía podría conducir a la inconstancia, ¿verdad? (tiene datos potencialmente diferentes almacenados en dos lugares, 1. En el caché, que usa la aplicación pública, y 2. en el DB, a los que la aplicación de administrador accede directamente. – UpTheCreek

+0

@UpTheCreek, correcto, solo quería decir que no tiene que inclinar la cabeza sobre la invalidación de caché/caché para "Admin-part". Claro, puede tener la incoherencia, todo tipo de problemas de concurrencia pero serían tema más allá del almacenamiento en caché. Mencioné que solo porque dijiste que "realmente no quieres tener que configurar algún tipo de caché distribuida solo para una aplicación de administrador de bajo uso". En su lugar, debe preocuparse por datos obsoletos en su parte pública. –

+0

Además, en mi opinión, es un enfoque incluso mejor contar con una única aplicación y hacerlo escalable. Seguro, te enfrentarías a todos los problemas de "caché en el caché y fuera de la memoria caché", pero tendrás más control y no tendrás que pensar en la "sincronización" entre 2 aplicaciones. –

Cuestiones relacionadas