Des sessions multiples Usines sous Spring/Hibernate
Que j'ai reçu une exigence où j'ai besoin de prendre en charge plusieurs bases de données dans la même instance, à l'appui de multi-location. Chaque DB a un schéma identique. L'utilisateur se connecte à une base de données spécifique en choisissant parmi une liste, et tous les appels suivants seront aller à l'DB jusqu'à ce qu'ils se déconnecter.
Je veux d'échange à chaud de la session de l'usine à l'intérieur d'un seul HibernateDaoTemplate en fonction d'un paramètre fourni par le client.
Je peux trouver des tas de trucs sur l'échange à chaud de sources de données (et de toutes les transactions enjeux associés à la) mais je veux hot swap session usines de retenue de tous, la mise en cache pour chaque.
Quelle est la meilleure façon de le faire? Configurer un HotSwappableTarget pour la DaoTemplate? Quelqu'un peut-il m'indiquer des échantillons sur comment faire cela?
OriginalL'auteur Verdant | 2008-09-23
Vous devez vous connecter pour publier un commentaire.
Si toutes les bases de données sont identiques, alors je peux vous proposer l'aide d'un seul SessionFactory et en fournissant vos propres mises en œuvre pour la source de données et le Cache qui sont en fait de "locataire". (Mise en œuvre de ces est assez trivial: il suffit de maintenir une carte de locataire id -> real cache/véritable source de données, puis de déléguer tous les appels à la correspondante). Configurer le seul SessionFactory pour l'utilisation de votre locataire conscient de Cache et de la source de données. Un ThreadLocal peut être utilisé pour faire le locataire de l'ID de la requête courante à la disposition de tout le code qui a besoin de savoir à ce sujet.
J'ai utilisé cette méthode avant de réussir à l'appui de multi-location.
OriginalL'auteur alasdairg
Où j'ai utilisé de travail que nous avons fait cette via ThreadLocal suivantes le présent guide. Nous avons juste utilisé une SessionFactory et échangé de la source de données basée sur une variable de session, l'utilisateur peut modifier tout en étant connecté. Je ne me souviens pas des détails précis, mais si vous êtes intéressés, je peux déterrer quelques-uns plus d'informations sur notre mise en œuvre.
Ceci dit, les gars de mon ancien lieu de travail sont maintenant de passer à l'écart de cette approche et vers une base de données fragmenté. Certainement une solution plus élégante que je vous recommande de jeter un oeil à.
OriginalL'auteur stian
prolonger votre classe DAO de HibernateDaoSupport, alors invoquer setSessionFactory() la méthode, pour faire l'échange à chaud des bases de données
OriginalL'auteur
Vous pouvez également jeter un oeil à la Hibernate Shards projet:
http://www.hibernate.org/414.html
... qui se concentre sur l'ajout du support pour le partitionnement horizontal à Hibernate Core. Il n'a pas encore de couvrir l'intégralité de l'API Hibernate, mais prend en charge une grande partie de celui-ci (qui peut ou peut ne pas être suffisant pour vos besoins). Bien sûr, ils travaillent en vue d'obtenir une couverture complète.
OriginalL'auteur alasdairg
J'ai aussi essayé le fournisseur de cache via ThreadLocal et la partie la plus difficile a été de faire l'échange à chaud sur le cache, vous devez vous assurer de la SessionFactory n'a pas de sessions actives associer avec elle. Maintenant, je pense qu'il y a une bien meilleure solution: en utilisant le Printemps 3 java configuration, vous pouvez créer votre locataire-conscient SessionFactory de façon dynamique et laissez Printemps pour faire la gestion du cache pour vous.
OriginalL'auteur renfred