Mysql
 sql >> база данни >  >> RDS >> Mysql

c3p0 казва - java.lang.Изключение:САМО ОТГРАНЯВАНЕ:Просрочено проследяване на стека за изтегляне на ресурс при стартиране на транзакция в хибернация

Някои предложения за отстраняване на грешки

  • Както Стив спомена в коментарите. Опитайте да видите какво се случва, когато премахнете опцията 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;
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ЗА АКТУАЛИЗИРАНЕ v/s ЗАКЛЮЧВАНЕ В РЕЖИМ НА СПОДЕЛЯНЕ:Позволете на едновременните нишки да четат актуализираната стойност на състоянието на заключения ред

  2. Актуализирайте, ако съществува, вмъкнете, ако не съществува

  3. SQL Съхранена процедура - променливата е твърде кратка

  4. MySQL &PHP:Търсене по множество ключови думи

  5. Защо моята заявка с няколко колони е драматично по-бавна от съответните заявки с една колона, дори и с индекс от няколко колони?