Не удалось откатить транзакцию 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, чтобы иметь трассировку стека, которая печатает точную причину? Я просто хочу еще раз напомнить, что все время работает нормально, но иногда это не работает из-за этого исключения.
Я надеюсь, что я четко объяснил свою проблему. Пожалуйста, сделайте все необходимое, дав решение.