Някои предложения за отстраняване на грешки
-
Както Стив спомена в коментарите. Опитайте да видите какво се случва, когато премахнете опцията unreturnedConnectionTimeout.
-
Може би вашите запитвания отнемат твърде много време. Опитайте да регистрирате някои статистически данни за ефективността на вашия код и вижте колко време отнема вашата заявка. Може би трябва да настроите заявката си. и за краткосрочен план можете също да увеличите unreturnedConnectionTimeout, за да бъде повече от времето за отговор на вашите заявки.
-
Също така опитайте опцията за изчакване на транзакцията в хибернация. Може да се настрои tx.setTimeout(20) и да се играе с номерата за изчакване и да се види дали някои заявки имат изчакване.
-
Може също да искате да използвате някакъв инструмент за профилиране. Опитайте VisualVM в случай, че вашата версия на Java се поддържа от него. В противен случай (ако сте на linux или mac) може да искате да опитате Команди за отстраняване на грешки в Java на по-стара версия на java. Някои от тези команди са достъпни и от JDK.
Малки подобрения на кода
-
Не сте сигурни дали това наистина ще реши проблема ви, но може да искате да добавите връщане назад за транзакция в блок за изключения. Добавен е още един опит за хващане за tx.close, за да се избегне друго изключение.
-
Добавена е и нулева проверка за затваряне на сесията. Може би вече знаете, че едно условие, когато finally, може да не се изпълни напълно - ако в блока finally бъде хвърлено друго изключение. Понастоящем може да не е приложимо във вашия код, но в случай, че добавите повече от един ред в блока finally, уверете се, че всички изключения са покрити, за да може да се изпълни следващият ред.
-
Още едно предложение е да се намали обхватът на самата транзакция. Гледайки кода, изглежда, че може да се нуждаете от транзакцията само в случай, че uid не бъде намерен. Какво ще кажете за ограничаване на кода на транзакцията в блока if(u==null). Не съм сигурен дали помага, но не е необходимо да имате транзакция за четене.
По-долу е моят примерен код
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;
}