Mysql
 sql >> Datenbank >  >> RDS >> Mysql

c3p0 sagt - java.lang.Exception:NUR DEBUG:Überfälliger Stack-Trace beim Auschecken von Ressourcen beim Starten einer Hibernate-Transaktion

Einige Vorschläge zum Debuggen

  • Wie Steve in den Kommentaren erwähnte. Versuchen Sie zu sehen, was passiert, wenn Sie die unreturnedConnectionTimeout-Option entfernen.

  • Möglicherweise dauern Ihre Abfragen zu lange. Versuchen Sie, einige Leistungsstatistiken für Ihren Code zu protokollieren, und sehen Sie, wie viel Zeit Ihre Abfrage benötigt. Möglicherweise müssen Sie Ihre Abfrage optimieren. Kurzfristig können Sie auch unreturnedConnectionTimeout auf mehr als die Antwortzeit auf Ihre Abfragen erhöhen.

  • Probieren Sie auch die Transaktions-Timeout-Option im Ruhezustand aus. Kann tx.setTimeout(20) gesetzt werden und mit den Timeout-Zahlen spielen und sehen, ob einige Abfragen Timeout haben.

  • Möglicherweise möchten Sie auch ein Profilerstellungstool verwenden. Probieren Sie VisualVM aus falls Ihre Java-Version darauf unterstützt wird. Andernfalls (unter Linux oder Mac) können Sie Java Debugging-Befehle auf älteren Java-Versionen. Einige dieser Befehle sind auch im JDK verfügbar.

Kleine Verbesserungen am Code

  • Nicht sicher, ob es Ihr Problem wirklich behebt, aber Sie möchten vielleicht ein Rollback für die Transaktion im Ausnahmeblock hinzufügen. Ein weiterer try catch für tx.close wurde hinzugefügt, um eine weitere Ausnahme zu vermeiden.

  • Außerdem wurde eine Nullprüfung für das Schließen der Sitzung hinzugefügt. Möglicherweise wissen Sie bereits, dass eine Bedingung, wenn finally möglicherweise nicht vollständig ausgeführt wird, wenn eine andere Ausnahme in den finally-Block geworfen wird. Derzeit ist es möglicherweise nicht in Ihrem Code anwendbar. Falls Sie jedoch mehr als eine Zeile in den finally-Block einfügen, stellen Sie sicher, dass alle Ausnahmen abgedeckt sind, damit die nächste Zeile ausgeführt werden kann.

  • Ein weiterer Vorschlag ist, den Umfang der Transaktion selbst zu reduzieren. Wenn Sie sich den Code ansehen, brauchen Sie die Transaktion möglicherweise nur, falls keine UID gefunden wird. Wie wäre es mit einer Begrenzung des Transaktionscodes innerhalb des if(u==null)-Blocks? Nicht sicher, ob es hilft, aber Sie müssen keine Transaktion zum Lesen haben.

Unten ist mein Beispielcode

    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;
}