Passer au contenu principal
Multitenancy avec CDI+JPA
ou Spring+Hibernate
Florian Beaufumé
06/2015
Florian Beaufumé
• Architecte logiciel
• Spécialisé en Java et web
• Freelance
• florian.beaufume@adeliosys.fr
• www.adeliosys.fr
• www.linkedin.com/in/fbeaufume
App 1
Base 1
App 2
Base 2
App
Base 1 Base 2
Single-tenant Multitenant
Multitenancy
• Types :
• Database-per-tenant
• Schema-per-tenant
• Shared tables
• Datasource-per-tenant
• Bénéfices :
• Opérations simplifiées (mise à jour, monitoring, etc.)
• Optimisation des ressources
• Fonctionnalités cross-tenant (tableau de bord, délégation,
etc.)
Isolation
Multitenancy
• Supporter "database-per-tenant" et "schema-per-tenant"
• Supporter les opérations cross-tenant
• Supporter des données communes en plus de données
spécifiques
• Etre implémentable via JPA ou Hibernate et plus si
affinités
Objectifs
Existant
CDI Spring
JPA Hibernate
Spécification
Java EE
Produit
Injection de
dépendance
Mapping objet
relationnel Implémente
• JPA 2.1 (c.a.d Java EE 7) :
• Multitenancy prévue puis abandonnée
• CDI :
• Pas de fonctionnalités dédiées, utilisé pour DI et cycle de
vie des composants
Existant
• Hibernate :
• 4.3 :
• Supporte "database-per-tenant" et "schema-per-tenant"
• Mais une seule current session par session factory et par
contexte
• Le cache L2 est "tenant aware", mais pas les stats de SF
• 5.0 :
• Ajout du support de "shared tables"
• Spring :
• Pas de fonctionnalités dédiées, utilisé pour DI et cycle de
vie des composants
• Même modèle de current session qu'Hibernate
Existant
Données communes Données spécifiques
Table APPUSER (schéma commun)
Table ITEM (schéma tenant1)
Table ITEM (schéma tenant2)
Implémentation
MyApp-Common-DS
MyApp-Specific-Tenant1-DS
MyApp-Specific-Tenant2-DS
• Implémentation CDI+JPA :
• http://localhost:8080/multitenant-jpa/
• Implémentation Spring+Hibernate :
• http://localhost:8080/multitenant-hibernate/
• Implémentation CDI+Jongo :
• http://localhost:8080/multitenant-jongo/
Démonstration
Implémentation
1
2 3
4
• Plusieurs stratégies possibles
• Tests unitaires : mocking
• Tests d'intégration :
• CDI+JPA : Arquillian
• Spring+Hibernate : JTA avec Atomikos
Tests