2012-06-30 3 views
0

Nous utilisons Hibernate avec Spring pour notre application Java. Nous découvrons que lorsqu'une session de mise à jour quelque chose dans la base de données d'autres sessions ne peut pas voir la mise à jour. Par exemple user1 obtient le solde du compte de la base de données puis user2 augmente le solde, si user1 obtient l'objet une autre fois il voit le solde du compte avant la mise à jour (semble que la session utilise la valeur de son cache) nouveau solde du compte. User1 utilise une session pendant toute activité différente de la session utilisateur2. Y a-t-il une configuration à forcer pour obtenir l'objet mis à jour de la base de données? ou toute autre aide?Hibernate + Spring + session + cache

+0

valider chaque transaction exécutée avec DB. – Ved

+0

Veuillez préciser les limites des transactions/sessions en termes d'ouverture/fermeture, de sélection/mise à jour/insertion des heures des deux clients et le niveau d'isolation des transactions que vous utilisez. – tscho

Répondre

1

Cela est par nature (pensez à Session comme "unité de travail"); Les sessions doivent être isolées des transactions. C'est l'une des nombreuses raisons pour lesquelles les sessions devraient être de courte durée. J'ai l'impression que vous utilisez des séances de longue durée.

Mais dans tous les cas, vous pouvez forcer l'autre session (user1 dans votre cas) à actualiser son état du compte en utilisant session.refresh(theAccount);. REFRESH est aussi une action cascadable, si vous avez besoin d'un état dépendant pour être rafraîchi lorsque vous actualisez le compte ...

0

Si vous utilisez une seule session pour toutes les activités, ce que vous voyez est à prévoir.

La session 1 charge l'objet qui est ensuite modifié par la session 2. Toutefois, la session 1 est toujours ouverte l'objet se trouve dans le cache de session (premier niveau). Vous pouvez actualiser Session1 en utilisant session.clear() puis, si vous rechargez l'objet, vous obtiendrez la version mise à jour.

+0

Cette dernière déclaration n'est pas exacte Alex dans le cas que vous proposez puisqu'ils ont juste effacé() l'ancien état de compte et l'ont rechargé de la base de données * avec la nouvelle version * –

+0

Désolé. C'était un aparté basé sur le partage du même objet sans rechargement. J'aurais dû être clair. –

+0

Je l'ai supprimé car il n'ajoute aucune valeur de toute façon! –

Questions connexes