Mysql
 sql >> Database >  >> RDS >> Mysql

c3p0 dice - java.lang.Exception:SOLO DEBUG:traccia dello stack di check-out delle risorse scaduta all'avvio di una transazione di ibernazione

Alcuni suggerimenti per eseguire il debug

  • Come ha detto Steve nei commenti. Prova a vedere cosa succede quando rimuovi l'opzione unreturnedConnectionTimeout.

  • Potrebbe essere che le tue domande stiano impiegando troppo tempo. Prova a registrare alcune statistiche sulle prestazioni sul tuo codice e guarda quanto tempo sta impiegando la tua query. Potrebbe essere necessario ottimizzare la tua query. e per un breve periodo puoi anche aumentare il non restituitoConnectionTimeout in modo che sia più del tempo di risposta alle tue domande.

  • Prova anche l'opzione di timeout della transazione in ibernazione. Può essere impostato tx.setTimeout(20) e giocare con i numeri di timeout e vedere se alcune query vanno in timeout.

  • Potresti anche voler utilizzare uno strumento di profilazione. Prova VisualVM nel caso in cui la tua versione Java sia supportata su di esso. Altrimenti (se su Linux o Mac) potresti provare Comandi di debug Java su una versione precedente di java. Alcuni di questi comandi sono disponibili anche da JDK.

Piccoli miglioramenti al codice

  • Non sono sicuro che risolverà davvero il tuo problema, tuttavia potresti voler aggiungere il rollback per la transazione nel blocco dell'eccezione. Aggiunto un altro try catch per tx.close per evitare un'altra eccezione.

  • Aggiunto anche un controllo nullo per la chiusura della sessione. Potresti già sapere che una condizione in cui finalmente potrebbe non essere eseguita completamente, se un'altra eccezione viene generata nel blocco finally. Attualmente potrebbe non essere applicabile nel tuo codice, tuttavia, nel caso in cui aggiungi più di una riga nel blocco finale, assicurati che tutte le eccezioni siano coperte in modo che la riga successiva possa essere eseguita.

  • Un altro suggerimento è di ridurre l'ambito della transazione stessa. Guardando il codice sembra che potresti aver bisogno della transazione solo nel caso in cui non venga trovato un uid. Che ne dici di limitare il codice della transazione all'interno del blocco if(u==null). Non sono sicuro se aiuta, ma non è necessario che la transazione sia letta.

Di seguito è riportato il mio codice di esempio

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