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