example - Fábricas de sesiones múltiples en Spring/Hibernate
spring hibernate example (5)
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 "conscientes del inquilino". (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 apoyar con éxito multi-tenancy.
Se me ha dado un requisito en el que necesito admitir múltiples bases de datos en la misma instancia, para admitir el 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.
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 sobre fuentes de datos intercambiables en caliente (y todos los problemas de transacciones asociados con eso), pero quiero intercambiar fábricas de sesión en caliente, 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?
También puedes echar un vistazo al proyecto Hibernate Shards:
http://www.hibernate.org/414.html
... que está enfocado en agregar soporte para particiones horizontales al 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.
Donde solía trabajar lo hicimos a través de ThreadLocal siguiendo esta guía. 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 está interesado, puedo obtener más información sobre nuestra implementación.
Dicho esto, 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.
amplíe su clase DAO desde HibernateDaoSupport, luego invoque el método setSessionFactory (), para hacer el intercambio en caliente de las bases de datos
También probé con el proveedor de caché a través de ThreadLocal y la parte difícil fue hacer el intercambio en caliente en el caché, debes asegurarte de que SessionFactory no tenga ninguna sesión activa asociada. 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.