Mysql
 sql >> Baza danych >  >> RDS >> Mysql

c3p0 mówi - java.lang.Wyjątek:TYLKO DEBUGOWANIE:Zaległy ślad stosu pobierania zasobów podczas uruchamiania transakcji hibernacji

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ponownie wprowadzono nieznany błąd indeksu początkowego zestawu znaków?

  2. MySQL - Perl:Jak uzyskać tablicę kodów pocztowych w ramach przesłanego x mil przesłanego kodu pocztowego w przykładzie Perla?

  3. Wydrukuj informacje debugowania z procedury składowanej w MySQL

  4. Wstaw wybrane dane do bazy danych

  5. MySQL:Auto inkrementacja tylko z liczbami parzystymi lub nieparzystymi?