Kilka sugestii dotyczących debugowania
-
Jak wspomniał Steve w komentarzach. Spróbuj zobaczyć, co się stanie, gdy usuniesz niezwróconą opcjęConnectionTimeout.
-
Być może Twoje zapytania trwają zbyt długo. Spróbuj zarejestrować niektóre statystyki wydajności w kodzie i zobacz, ile czasu zajmuje Twoje zapytanie. Być może musisz dostroić swoje zapytanie. a na krótką metę możesz również zwiększyć niezwrócony czas połączenia, aby był większy niż czas odpowiedzi na twoje zapytania.
-
Wypróbuj również opcję limitu czasu transakcji w stanie hibernacji. Można ustawić tx.setTimeout(20) i bawić się liczbami limitów czasu i sprawdzić, czy niektóre zapytania nie wygasły.
-
Możesz także użyć jakiegoś narzędzia do profilowania. Wypróbuj VisualVM jeśli Twoja wersja Java jest na nim obsługiwana. W przeciwnym razie (na Linuksie lub Macu) możesz spróbować Polecenia debugowania Java na starszej wersji javy. Niektóre z tych poleceń są również dostępne w JDK.
Niewielkie ulepszenia kodu
-
Nie jesteś pewien, czy to naprawdę naprawi Twój problem, ale możesz dodać wycofanie dla transakcji w bloku wyjątków. Dodano kolejny chwyt próbny dla tx.close, aby uniknąć kolejnego wyjątku.
-
Dodano również sprawdzanie wartości null dla zamknięcia sesji. Możesz już wiedzieć, że jeden warunek, kiedy w końcu może nie zostać całkowicie wykonany - jeśli inny wyjątek zostanie zgłoszony w bloku finally. Obecnie może nie mieć zastosowania w twoim kodzie, jednak w przypadku dodania więcej niż jednej linii w bloku końcowym upewnij się, że wszystkie wyjątki są uwzględnione, aby następna linia mogła zostać wykonana.
-
Jeszcze jedna sugestia to zmniejszenie zakresu samej transakcji. Patrząc na kod, wydaje się, że możesz potrzebować transakcji tylko w przypadku, gdy nie zostanie znaleziony uid. Co powiesz na ograniczenie kodu transakcji wewnątrz bloku if(u==null). Nie jestem pewien, czy pomaga, ale nie musisz mieć transakcji do odczytu.
Poniżej znajduje się mój przykładowy kod
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;
}