Не удалось откатить транзакцию Hibernate; вложенное исключение - org.hibernate.TransactionException: откат JDBC не выполнен

У меня есть приложение, которое содержит веб-сервис, который использует Spring и Hibernate для извлечения данных из базы данных. Другие приложения вызывают этот веб-сервис в своем приложении.

Поток веб-сервиса:

Метод класса Webservice (вызывает метод класса менеджера) -> Метод класса менеджера ---> который вызывает метод DAO)

 Webservice class :

 public List getXXX(){
      managerClass.getXX();

  }

 manager Class:

 @Transactional(readOnly=true)

 Public List getXX(){
      DAOClass.getX();
  }

Класс DAO (он использует hibernate и логику для извлечения данных):

   public List getX(){
      Criteria query 
     =getSessionFactory().getCurrentSession()
   .createCriteria(dataObject.class);
    query.add(Restrictions.eq(dataObject.type, systemId));
    query.addOrder(Order.asc(dataObject.TYPE));
    query.addOrder(Order.asc(dataObject.code));

    return query.list();

    }

Этот метод веб-сервиса (путем вызова менеджера и классов DAO) выдаёт список из базы данных. Работает нормально все время, кроме иногда.

Я не обновляю и не вставляю какие-либо данные, я просто получаю данные

(Поток такой: Webservice -> Класс менеджера -> DAO -> Спящий режим)

Один клиент обращается к этому методу, чтобы получить список в своем приложении. Он все время правильно получает данные. Но иногда он получает следующее исключение:

javax.xml.ws.soap.SOAPFaultException: не удалось откатить транзакцию Hibernate; вложенное исключение - org.hibernate.TransactionException: откат JDBC не выполнен
в org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.createSystemException(MethodMarshallerUtils.java:1346)
в org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.demarshalFaultResponse (MethodMarshallerUtils.java:1072)
at org.apache.axis2.jaxws.marshaller.impl.alt.DocLitWrappedMethodMarshaller.demarshalFaultResponse (DocLitWrappedMethodMarshaller.java:593)
в org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.getFaultResponse(JAXWSProxyHandler.java:559)
в org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.createResponse(JAXWSProxyHandler.java:497)
в org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:404)
в org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:208)

Согласно поведению Spring по умолчанию, всякий раз, когда генерируется исключение, он пытается выполнить откат. Это то, что он пытается, но каким-то образом не может выполнить откат. Поскольку это декларативная транзакция с использованием аннотаций, как я могу отследить точную причину этого исключения? основываясь на исключении, я точно знаю, что метод класса DAO генерирует исключение. Но я не могу отследить точную причину (проблема с закрытием соединения или что-то еще). Я просто хочу использовать обработку исключений в классе DAO, чтобы знаю точную причину. Могу ли я использовать блок try/catch в методе класса DAO, чтобы иметь трассировку стека, которая печатает точную причину? Я просто хочу еще раз напомнить, что все время работает нормально, но иногда это не работает из-за этого исключения.

Я надеюсь, что я четко объяснил свою проблему. Пожалуйста, сделайте все необходимое, дав решение.

0 ответов

Другие вопросы по тегам