2008-09-23 17 views
8

Se me ha dado un requisito en el que necesito admitir varias bases de datos en la misma instancia, para admitir multi-tenancy. Cada DB tiene un esquema idéntico. El usuario inicia sesión en una base de datos específica al elegir de una lista, y todas las llamadas posteriores irán a ese DB hasta que se cierre la sesión.Fábricas de sesión múltiple en Spring/Hibernate

Quiero intercambiar en caliente la fábrica de sesiones dentro de una única HubenateDaoTemplate basada en un parámetro proporcionado por el cliente.

Puedo encontrar muchas cosas en las fuentes de datos intercambiables en caliente (y todos los problemas de transacción asociados con eso), pero quiero cambiar las fábricas de sesión de intercambio - conservando todo el almacenamiento en caché para cada una.

¿Cuál es la forma más fácil de hacer esto? Configurar un HotSwappableTarget para DaoTemplate? ¿Alguien puede señalarme muestras sobre cómo hacer esto?

Respuesta

2

Si todas las bases de datos son idénticas, entonces puedo sugerir el uso de una sola SessionFactory y proporcionar sus propias implementaciones para DataSource y Cache que sean realmente "tenants-aware". (La implementación de estos es bastante trivial: simplemente mantenga un mapa de identificación de inquilino -> fuente de datos real de caché/real y luego delegue todas las llamadas al apropiado). Configure el SessionFactory único para usar su Cache y DataSource conscientes de los inquilinos. Un ThreadLocal se puede usar para hacer que la ID del inquilino de la solicitud actual esté disponible para cualquier código que necesite saber al respecto.

He utilizado este enfoque antes para admitir con éxito multi-tenancy.

+0

Buena idea, pero ¿cómo se cambia en la memoria caché de inquilinos? Todo lo que puede hacer es configurar un proveedor de caché, e hibernar lo usa debajo de las coberturas para crear un caché. ¿Tal vez implemente un CacheProvider que a su vez genere un contenedor de caché compatible con el inquilino? – Verdant

0

También puede echar un vistazo en el proyecto de Hibernate Fragmentos:

http://www.hibernate.org/414.html

... que se centra en la adición de soporte para la partición horizontal a la Hibernate Core. Todavía no cubre la API completa de Hibernate, pero sí admite una gran parte (que puede o no ser suficiente para sus necesidades). Por supuesto, están trabajando para lograr una cobertura completa.

2

Donde solía trabajar, lo hacíamos a través de ThreadLocal después de this guide.. Solo usamos una SessionFactory y cambiamos su fuente de datos en función de una variable de sesión que el usuario podría cambiar al iniciar sesión. No recuerdo los detalles exactos, pero si Estoy interesado. Puedo obtener más información sobre nuestra implementación.

Sin embargo, los chicos de mi antiguo lugar de trabajo ahora se están alejando de este enfoque y hacia una base de datos fragmentada. Definitivamente una solución más elegante que recomiendo que eche un vistazo.

1

extender su clase DAO de HibernateDaoSupport, a continuación, invocar el método setSessionFactory(), para hacer el intercambio en caliente de las bases de datos

0

También probé el proveedor de memoria caché a través de ThreadLocal y la parte difícil estaba haciendo el intercambio en caliente en la caché , debe asegurarse de que SessionFactory no tenga asociado ninguna sesión activa. Ahora, creo que hay una solución mucho mejor: al usar la configuración Java de Spring 3, puede crear su SessionFactory consciente de los inquilinos de forma dinámica y dejar que Spring haga la gestión de caché por usted.

Cuestiones relacionadas