tenant multi java spring hibernate jdbc multi-tenant

java - multi tenant spring boot



Fuentes de datos multiusuario-Spring+Hibernate (3)

Estoy escribiendo una aplicación web que soporta múltiples usuarios. Cada usuario tiene su propia base de datos, utilizando H2. Todos los esquemas de base de datos son los mismos.

Deseo usar Spring + Hibernate para esta aplicación.

Entonces, ¿no me atrevo a cómo asociar la base de datos de un usuario con ese usuario, tal vez lo asocie en la sesión HTTPS y extienda el AbstractRoutingDataSource de Spring? ¿Pero no afectaría esto al caché de Hibernate? Otra forma es tener una SessionFactory con cada fuente de datos, aunque el esquema de cada fuente de datos sea el mismo ... así que lo veo como un desperdicio.

De todos modos, la selección de la fuente de datos debe ser dinámica: no se pueden preconfigurar en archivos de contexto, ya que cada nuevo usuario tendrá su propia base de datos creada. ¿Hay marcos / soluciones existentes?

No sé mucho sobre los fragmentos de hibernación, tal vez eso funcione?


Gracias a la ayuda de las 2 personas (Pascal y org.life.java)!

Es posible, pero con algunos problemas: por ejemplo, caché de caché / consulta de segundo nivel de hibernación.

Este enlace proporcionado por Pascal es un recurso muy bueno:

http://www.jroller.com/kenwdelong/entry/horizontal_database_partitioning_with_spring .

Mi principal motivación para dar a cada usuario una base de datos separada es porque es probable que los datos crezcan rápidamente, por lo que se requiere una partición horizontal.



Podría estar equivocado acerca de la necesidad (estricta) de tener una SessionFactory por base de datos, como lo sugieren algunos recursos:

Tomaré un tiempo para volver a leer todo mañana (no obtuve todos los detalles para ser honesto) y para entender completamente las implicaciones de tal configuración (aunque parece claro que romperá el caché de segundo nivel) . Volveré sobre esto más tarde.

Estoy escribiendo una aplicación web que soporta múltiples usuarios. Cada usuario tiene su propia base de datos, utilizando H2. Todos los esquemas de base de datos son los mismos.

Me pregunto cómo se escalará ... ¿Cuántos usuarios tiene? ¿Cómo se ejecuta H2, qué modo?

Entonces, ¿no me atrevo a cómo asociar la base de datos de un usuario con ese usuario, tal vez lo asocie en la sesión HTTPS y extienda el AbstractRoutingDataSource de Spring?

Tendrá que crear un SessionFactory por usuario y asociarlo al usuario registrado (en un Map , usando el inicio de sesión como clave) y luego obtener una Session de un SessionFactory determinado. Vincular el ciclo de vida de SessionFactory a la sesión HTTP parece ser una buena idea (para ahorrar algo de memoria), pero no estoy seguro de que Spring sea muy útil aquí. Podría estar equivocado, pero una variación de la clase HibernateUtil y un enfoque completamente programático parece más fácil. Por cierto, no estoy seguro de que necesites varias conexiones por usuario.

¿Pero no afectaría esto al caché de Hibernate?

Que caché

Otra forma es tener una SessionFactory con cada fuente de datos, aunque el esquema de cada fuente de datos sea el mismo ... así que lo veo como un desperdicio.

Oh, es un desperdicio, pero eso es lo que quieres hacer (una base de datos por usuario). Y no tiene la opción (necesita una SessionFactory por base de datos). ¿Por qué necesitas una base de datos por usuario en realidad? ¿Estás seguro de que esta es una decisión sabia? Como ya se indicó, esto significa muchos problemas, no se escalará bien, agregará complejidad, etc. ¿Por qué no usar una única base de datos y asociar datos al usuario?

De todos modos, la selección de la fuente de datos debe ser dinámica: no se pueden preconfigurar en archivos de contexto, ya que cada nuevo usuario tendrá su propia base de datos creada. ¿Hay marcos / soluciones existentes?

No que yo sepa. Es por eso que creo que tendrás que hacer todo programáticamente.

No sé mucho sobre los fragmentos de hibernación, tal vez eso funcione?

Dadas las necesidades dinámicas de su aplicación, no veo cómo podría ayudar.