sql >> Databáze >  >> RDS >> Mysql

c3p0 říká - java.lang.Výjimka:DEBUG ONLY:Trasování zásobníku zpožděného odhlášení zdrojů při zahájení transakce hibernace

Několik návrhů k odladění

  • Jak Steve uvedl v komentářích. Zkuste se podívat, co se stane, když odeberete možnost unreturnedConnectionTimeout.

  • Vaše dotazy možná trvají příliš dlouho. Zkuste do kódu zaznamenat nějaké statistiky výkonu a uvidíte, jak dlouho váš dotaz zabírá. Možná budete muset vyladit svůj dotaz. a krátkodobě můžete také zvýšit unreturnedConnectionTimeout tak, aby byl delší než doba odezvy na vaše dotazy.

  • Vyzkoušejte také možnost časového limitu transakce v režimu spánku. Může být nastaveno tx.setTimeout(20) a hrát si s čísly timeoutu a zjistit, zda některým dotazům nevypršel časový limit.

  • Můžete také chtít použít nějaký nástroj pro profilování. Vyzkoušejte VisualVM v případě, že je na něm podporována vaše verze Java. Jinak (pokud používáte linux nebo mac) můžete zkusit Příkazy ladění Java na starší verzi Java. Některé z těchto příkazů jsou také dostupné z JDK.

Malá vylepšení kódu

  • Nejste si jisti, zda to skutečně vyřeší váš problém, ale možná budete chtít přidat vrácení zpět pro transakci do bloku výjimky. Přidán další pokus o úlovek pro tx.close, aby se předešlo další výjimce.

  • Také přidána kontrola nuly pro uzavření relace. Možná už víte, že jedna podmínka, kdy se konečně, nemusí úplně vykonat - pokud je vyvolána další výjimka v bloku Konečně. V současné době to nemusí být použitelné ve vašem kódu, ale v případě, že přidáte více než jeden řádek do bloku konečně, ujistěte se, že jsou pokryty všechny výjimky, aby se mohl spustit další řádek.

  • Dalším návrhem je snížit rozsah samotné transakce. Při pohledu na kód se zdá, že možná budete potřebovat transakci pouze v případě, že nebylo nalezeno uid. Co takhle omezit kód transakce uvnitř bloku if(u==null). Nejste si jisti, zda to pomůže, ale pro čtení nepotřebujete transakci.

Níže je můj ukázkový kód

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


  1. Jak používat MySQL s Deno a Oak

  2. Mám problém s připojením k mé db na godaddy s PDO

  3. Získání posledního ID vložení pro mysql po vložení

  4. Stejné přihlášení na 2 webech