Pregunta

Me han dado un requisito que me falta para el soporte de múltiples bases de datos en la misma instancia, para apoyar multi-tenancy.Cada DB tiene un esquema idéntico.El usuario se conecta a una base de datos específica por la elección de una lista, y todas las llamadas posteriores se vaya a la DB hasta que salga de la sesión.

Quiero intercambiar el calor de la sesión de fábrica dentro de una sola HibernateDaoTemplate en función de un parámetro suministrado por el cliente.

Me puede encontrar un montón de cosas en caliente-intercambio de fuentes de datos (y todas las ediciones de la transacción asociados con eso), pero quiero de intercambio en caliente sesión de fábricas de retención de todo el almacenamiento en caché para cada uno.

¿Cuál es la manera más fácil de hacer esto?Configurar un HotSwappableTarget para la DaoTemplate?Puede alguien me apunte a las muestras sobre cómo hacer esto?

¿Fue útil?

Solución

Si todas las bases de datos son idénticos, entonces me puede sugerir el uso de una sola SessionFactory y proporcionar sus propias implementaciones para el origen de datos y Caché que en realidad son "inquilino-consciente".(La aplicación de estos es bastante trivial:sólo mantener un mapa de inquilino id -> real cache/real origen de datos y, a continuación, delegado de todas las llamadas a la apropiada).Configurar el único SessionFactory utilizar su inquilino-consciente de la Caché y el origen de datos.Un ThreadLocal puede ser utilizado para hacer el inquilino de IDENTIFICACIÓN de la solicitud actual disponible para cualquier código que necesita saber acerca de él.

He utilizado este método antes con éxito para apoyar multi-tenancy.

Otros consejos

Donde solía trabajar hicimos esto a través de ThreadLocal siguientes la presente guía. Hemos usado una SessionFactory y cambiado el origen de datos basado en una variable de sesión, el usuario puede cambiar mientras está conectado.No recuerdo los detalles exactos, pero si usted está interesado me puede sacar algo más de información sobre nuestra aplicación.

Una vez dicho esto, los chicos en mi antiguo lugar de trabajo son ahora mucho más allá de este enfoque y hacia un sharded de la base de datos.Definitivamente una solución más elegante que yo te recomiendo echar un vistazo a.

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

También puede echar un vistazo a la Hibernación Fragmentos de proyecto:

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 cubren la totalidad de Hibernación de la API, pero sí una gran parte de la misma (que puede o puede no ser suficiente para sus necesidades).Por supuesto, ellos están trabajando para lograr una cobertura completa.

También probé el proveedor de caché a través de ThreadLocal y la parte más difícil fue hacer el intercambio en caliente en la caché, usted tiene que asegurarse de que el SessionFactory no tiene ningún sesiones activas asociar con él.Ahora, creo que hay una solución mucho mejor:mediante la Primavera 3 configuración de java, usted puede crear su inquilino-consciente SessionFactory de forma dinámica y dejar que la Primavera para hacer la gestión de la caché para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top