2013-06-25 1 views
0

C'est le problème qui m'a été posé par un de mes aînés.Hibernate Session Level Cache: Problème de connexion

1) Nous avons deux nœuds différents d'une application serveur J2EE:. 1 nœud et le nœud 2. (Comme le montre l'image ci-dessous)

2) hibernent également le cache de second niveau est activé.

3) Le problème est le suivant: Un utilisateur clique sur l'URL de la page de connexion et suppose que cette demande va au nœud 1 et aux journaux utilisateur, puis aux déconnexions utilisateur.

4) Encore demande de l'utilisateur pour la page de connexion et cette fois, la demande va au nœud 2. Maintenant, l'utilisateur se connecte et change son mot de passe et se déconnecte.

Maintenant, la question est lorsque l'utilisateur tente de se connecter avec son nouveau mot de passe et demande va vers le nœud 1. Est-ce-t-il capable de se connecter dans le système?

S'il ne peut pas le faire, ce qui pourrait être fait pour rendre la connexion de l'utilisateur avec son nouveau mot de passe sur le nœud 1.

Note: We have a LoginUser table where the Username and passwords are stored. 

enter image description here

Ma réponse:

Selon mon opinion, il pourrait être le cas que lorsque l'utilisateur tr Il se connecte en utilisant le nœud 1 puis se déconnecte.

feux Hibernate cette requête:

select * from Connexion où le nom d'utilisateur = "John";

Et cette entrée est mis en cache dans le cache de second niveau de noeud 1.

Maintenant, quand il se connecte au système en utilisant le nœud 2 et modifie son mot de passe. Et tente encore de se connecter au nœud 1, il n'est pas capable de se connecter avec son nouveau mot de passe, car cette fois le cache de deuxième niveau du nœud 1 contient l'ancien mot de passe, donc il peut se connecter en utilisant son ancien mot de passe.

C'est la raison pour laquelle il ne peut pas se connecter au nœud 1 avec un nouveau mot de passe.

Maintenant, la solution de ce problème pourrait être la réplication du cache de second niveau.

Veuillez partager vos entrées sur le même problème.

Répondre

3

La réponse à votre problème est un cache distribué de second niveau comme décrit dans la documentation Hibernate here. Infinispan est la plateforme la mieux supportée. Vous pouvez lire à propos de la configuration sur le Jboss wiki.

Cela prendra soin d'invalider le 2LC à travers le cluster lorsque les données mises en cache change sur l'un ou l'autre nœud. Le nœud auquel les utilisateurs demandent des requêtes saura alors que le cache est obsolète et ira dans la base de données pour charger les nouvelles données requises.

+0

Donc, vous voulez dire que c'est un problème valide? –

+0

C'est un problème très valable. L'invalidation du cache est toujours un problème délicat. Heureusement pour nous, nous avons des outils comme Infinispan et JGroups pour abstraire la complexité derrière une configuration simple. –

+0

À ma connaissance, chaque nœud du serveur possède sa propre sessionfactory, donc deux nœuds ont deux caches Second Level complètement différents. N'est-ce pas le cas? –