Mysql
 sql >> Base de données >  >> RDS >> Mysql

c3p0 indique - java.lang.Exception :DEBUG UNIQUEMENT :trace de la pile d'extraction des ressources en retard au démarrage d'une transaction d'hibernation

Quelques suggestions pour le déboguer

  • Comme Steve l'a mentionné dans les commentaires. Essayez de voir ce qui se passe lorsque vous supprimez l'option unreturnedConnectionTimeout.

  • Peut-être que vos requêtes prennent trop de temps. Essayez d'enregistrer des statistiques de performances sur votre code et voyez combien de temps votre requête prend. Peut-être avez-vous besoin d'ajuster votre requête. et à court terme, vous pouvez également augmenter le unreturnedConnectionTimeout pour qu'il soit supérieur au temps de réponse de vos requêtes.

  • Essayez également l'option de délai d'expiration de la transaction en veille prolongée. Peut être défini tx.setTimeout(20) et jouer avec les numéros de délai d'attente et voir si certaines requêtes expirent.

  • Vous pouvez également utiliser un outil de profilage. Essayez VisualVM au cas où votre version Java serait prise en charge. Sinon (si sur linux ou mac), vous pouvez essayer Commandes de débogage Java sur une ancienne version de java. Certaines de ces commandes sont également disponibles à partir du JDK.

Petites améliorations sur le code

  • Vous ne savez pas si cela résoudra vraiment votre problème, mais vous voudrez peut-être ajouter une restauration pour la transaction dans le bloc d'exception. Ajout d'un autre try catch pour tx.close afin d'éviter une autre exception.

  • Ajout également d'une vérification nulle pour la fermeture de session. Vous savez peut-être déjà qu'une condition lorsque finally peut ne pas s'exécuter complètement - si une autre exception est levée dans le bloc finally. Actuellement, cela peut ne pas être applicable dans votre code, mais si vous ajoutez plus d'une ligne dans le bloc finally, assurez-vous que toutes les exceptions sont couvertes afin que la ligne suivante puisse s'exécuter.

  • Une autre suggestion est de réduire la portée de la transaction elle-même. En regardant le code, il semble que vous n'ayez besoin de la transaction que si un uid n'est pas trouvé. Que diriez-vous de limiter le code de transaction à l'intérieur du bloc if(u==null). Je ne sais pas si cela aide, mais vous n'avez pas besoin d'avoir une transaction pour la lecture.

Ci-dessous mon exemple de code

    public static Basicinfo getBean(Integer iduser) {
    Basicinfo u = null;
    Transaction tx = null;
    Session sess = NewHibernateUtil.getSessionFactory().openSession();
    try {

        Query q = sess.createQuery("from Basicinfo where iduser=" + iduser);
        u = (Basicinfo) q.uniqueResult();
        if (u == null) {
            tx = sess.beginTransaction();   //line 69
            u = new Basicinfo();
            u.setIduser(iduser);
            tx.commit();
        }           
    } catch (Exception ex) {
        ex.printStackTrace();
        if(tx != null) {
            try {
             tx.rollback();
            } catch(Exception e){e.printStackTrace;}
        }
    } finally {
        if(sess!=null) {
         sess.close();
        }
    }
    return u;
}