2015-12-25 3 views
1

Я разрабатываю приложение с Spring MVC, Hibernate и базу данных MySQL Контроллер обрабатывает запрос и ответ. Hibernate обрабатывает транзакцию базы данных.Spring MVC -HIbernate-MySQL

Моя проблема в том, когда один или два доступа службы он отлично работает, но больше, чем это прекрасно работают в течение некоторого времени, но после того, что я получаю ошибку Окрашенные блокировки тайм-аут

//My sample Controller code 

@RequestMapping(value = "Bank", method = RequestMethod.GET) 
    public ResponseEntity<List<Bank>> getAllBank(@RequestHeader int data) { 
     try { 
      //My DAO implementation class for bank table 
      bankdao = new BankDAOImpl(); 
      List<Bank> bank = bankdao.getAllBank(data); 

      return new ResponseEntity<List<Bank>>(bank, HttpStatus.OK); 
     } catch (HibernateException he) { 
      return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); 
     } 
    } 

//My DAO implementation code 

public List<Bank> getAllBank(int organizationId) throws HibernateException { 
//I'm opening session in every function 
Session session = SessionFactoryUtil.getSessionFactory().openSession(); 
     try { 
      session.beginTransaction(); 
      Criteria criteria = session.createCriteria(Bank.class); 
      criteria.add(Restrictions.eq("organizationId", organizationId)); 
      criteria.add(Restrictions.eq("deleteFlag", false)); 
      criteria.addOrder(Order.asc("bankName")); 
      List<Bank> ls=criteria.list(); 
      return ls; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } finally { 
      session.getTransaction().commit(); 
      session.close(); 
     } 

Это заседание вызывает проблема Если я создаю отдельную сессионную фабрику для всех функций вместо открытия сеанса

Будет ли это решить мою проблему?

+1

попытайтесь использовать, @Autowired BankDAOImpl bankDAOImpl, вместо создания нового экземпляра –

+0

Не могли бы вы вставить фактическую трассировку стека для исключения тайм-аута блокировки? Кроме того, выполняете ли вы обновления в другом месте кода, который вы не опубликовали или каким-либо другим способом (например, в клиенте базы данных mysql)? –

+0

Есть ли у вас вложенные вызовы ваших методов dao? Когда один метод dao вызывает другое? Как настроить hibernate datasourse? – user1516873

ответ

2

Вам не следует создавать отдельную фабрику сеансов для каждого метода. Просто откройте сеанс. Возможно, проблема заключается в неправильном способе работы с транзакциями. Вы должны сделать это таким образом

public List<Bank> getAllBank(int organizationId) throws HibernateException { 
    //I'm opening session in every function 
    Session session = SessionFactoryUtil.getSessionFactory().openSession(); 
    Transaction tx = null; 
      try { 
       tx = session.beginTransaction(); 
       Criteria criteria = session.createCriteria(Bank.class); 
       criteria.add(Restrictions.eq("organizationId", organizationId)); 
       criteria.add(Restrictions.eq("deleteFlag", false)); 
       criteria.addOrder(Order.asc("bankName")); 
       List<Bank> ls=criteria.list(); 
       tx.commit();// commit here 
       return ls; 
      } catch (Exception e) { 
       e.printStackTrace(); 
       if (tx != null) { 
        tx.rollback();// rollback here 
       } 
       return null; 
      } finally { 
       session.close(); 
      } 
    } 

Может быть проблема ваша SessionFactoryUtil. Было бы интересно это увидеть.

+0

sessionFactoryUtil - это класс, в котором у меня есть привязка конфигурации sessionFactory к этому файлу cfg и сеансу приостановки – Sreemat

+0

@ Среда, которую я вижу. Надеюсь, вы создадите фабрику сеансов только один раз. –

+0

да, но открытие сессии во всех функциях. Я нашел одну возможность hibernatecp3 jar увеличить пул соединений, что помогает повысить производительность @ v.ladynev – Sreemat