Question

On m'a demandé de prendre en charge plusieurs bases de données dans la même instance, afin de prendre en charge la multi-location. Chaque base de données a un schéma identique. L'utilisateur se connecte à une base de données spécifique en choisissant dans une liste. Tous les appels suivants sont dirigés vers cette base de données jusqu'à ce qu'ils se déconnectent.

Je souhaite échanger à chaud la fabrique de sessions dans un seul modèle HibernateDaoTemplate en fonction d'un paramètre fourni par le client.

Je peux trouver plein de choses sur les sources de données échangeables à chaud (et sur tous les problèmes de transaction associés à cela), mais je souhaite échanger à chaud les fabriques de sessions - en conservant toute la mise en cache de chacune.

Quel est le moyen le plus simple de procéder? Configurer un HotSwappableTarget pour le DaoTemplate? Quelqu'un peut-il m'indiquer des exemples sur la façon de procéder?

Était-ce utile?

La solution

Si toutes les bases de données sont identiques, je peux alors vous suggérer d'utiliser une seule SessionFactory et de fournir vos propres implémentations pour la source de données et le cache, qui sont en réalité "compatibles avec les clients hébergés". (Leur mise en œuvre est assez simple: conservez simplement une carte de l'identifiant du locataire - > real cache / source de données réelle, puis déléguez tous les appels à celui qui convient). Configurez la seule SessionFactory pour utiliser votre cache et votre source de données compatibles avec le locataire. Un ThreadLocal peut être utilisé pour rendre l’ID de client hébergé de la demande en cours disponible pour tout code qui doit en connaître connaissance.

J'ai déjà utilisé cette approche pour prendre en charge la multi-location.

Autres conseils

Là où je travaillais, nous le faisions via ThreadLocal après ceci guide. Nous venons d'utiliser une SessionFactory et d'échanger sa source de données en fonction d'une variable de session que l'utilisateur pourrait modifier tout en étant connecté. Je ne me souviens pas des détails exacts, mais si cela vous intéresse, je peux obtenir davantage d'informations. sur notre mise en œuvre.

Cela dit, les employés de mon ancien lieu de travail s'éloignent maintenant de cette approche pour se tourner vers une base de données fragmentée. Certainement une solution plus élégante que je vous recommande de jeter un coup d'œil.

étendez votre classe DAO à partir de HibernateDaoSupport, puis appelez la méthode setSessionFactory () pour effectuer l'échange à chaud des bases de données

Vous pouvez également consulter le projet Hibernate Shards:

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

... qui se concentre sur l'ajout de la prise en charge du partitionnement horizontal au noyau Hibernate. Elle ne couvre pas encore l'intégralité de l'API Hibernate, mais en supporte une grande partie (ce qui peut ou non suffire à vos besoins). Bien sûr, ils travaillent pour une couverture complète.

J'ai également essayé le fournisseur de cache via ThreadLocal et la partie difficile étant l'échange à chaud sur le cache, vous devez vous assurer que SessionFactory n'est associée à aucune session active. Maintenant, je pense qu’il existe une bien meilleure solution: en utilisant la configuration Java de Spring 3, vous pouvez créer dynamiquement votre SessionFactory adaptée aux clients hébergés et laisser Spring se charger de la gestion du cache.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top