2017-10-11 13 views
0

Je développe une application Java-Web en utilisant Hibernate -> MySQL.Exception des transactions imbriquées bien que les méthodes synchronisées et la gestion des erreurs

Un utilisateur voit une page JSP, il appelle des contrôleurs pour obtenir des données de DB, il a aussi une fonction Javascript qui récupère des chaînes de données plus grandes via ajax.

Le problème: Lorsque l'utilisateur actualise la page juste après le chargement de la page, le servlet responsable des données ajax génère cette exception: org.hibernate.TransactionException: les transactions imbriquées pas prises en charge

Je crois Cela est provoqué par une transaction du premier appel, qui est toujours active lorsque l'utilisateur est actualisé et que le second appel est exécuté.

J'ai marqué chaque méthode de contrôleur avec interaction d'hibernation comme synchronisé. Maintenant, l'utilisateur peut actualiser 1-5 fois, mais l'exception se produit toujours. J'utilise Hibernate 4.3.1.

HibernateUtil.openSession() est juste sessionFactory.getCurrentSession();

C'est le contrôleur extrait où l'exception se produit:

public static synchronized Widget getWidgetById(long id) { 
    Widget result; 
    Session session = HibernateUtil.openSession(); 
    try { 
     Transaction tx = session.beginTransaction(); 
     try { 
      result = (Widget) session.get(Widget.class, id); 
      tx.commit(); 
     } catch (Exception ex) { 
      tx.rollback(); 
      throw ex; 
     } 
    } finally { 
     //disabled since we use transaction.auto_close_session 
     //session.close(); 
    } 
    return result; 
} 

Y a-t-il des erreurs que je na pas voir? Quel pourrait être le problème ici?

Répondre

0

L'ouverture d'une session d'hibernation dans le contrôleur n'est pas une implémentation appropriée pour la mise en veille prolongée. Vous devriez séparer votre session d'hibernation dans une couche de service ou même plus loin dans une couche d'accès aux données. Vous appelez ce contrôleur pour ouvrir la JSP, qui ouvre une session d'hibernation. Ensuite, votre requête ajax appelle le même contrôleur et tente d'ouvrir une session de mise en veille prolongée supplémentaire, mais vous en avez déjà une ouverte, ce qui vous donne l'exception de transaction imbriquée. Cela arrivera toujours si vous laissez la logique de session Hibernate dans le contrôleur. Vous devriez reconsidérer votre conception de l'application.

+0

merci pour la suggestion, mal jeter un oeil à ça! – user2312386