我有一个应用程序,其中包含一个使用 Spring 和休眠的 web 服务,以便从数据库中检索数据。其他应用程序在其应用程序中调用此 Web 服务。
网络服务流程:
Webservice类方法(调用管理器类方法)-->管理器类方法--->调用DAO方法)
Webservice class :
public List getXXX(){
managerClass.getXX();
}
manager Class:
@Transactional(readOnly=true)
Public List getXX(){
DAOClass.getX();
}
DAO 类(它使用休眠和逻辑来检索数据):
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();
}
此 Web 服务方法(通过调用管理器和 DAO 类)从数据库中提供列表。除了有时,它一直运行良好。
我没有更新或插入任何数据,我只是获取数据
(流程是:Webservice --> manager Class--> DAO --> hibernate)
一个客户正在访问此方法以在其应用程序中获取列表。他一直在正确获取数据。但有时他会收到此异常:
javax.xml.ws.soap.SOAPFaultException:无法回滚休眠事务;嵌套异常是 org.hibernate.TransactionException:JDBC 回滚
在 org.apache.axis2.jaxws.marshaller.impl.alt.MethodMarshallerUtils.createSystemException(MethodMarshallerUtils.java:1346)
处失败。 alt.MethodMarshallerUtils.demarshalFaultResponse(MethodMarshallerUtils.java:1072)
在 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.invokeSEIMethod(JAXWSProxyHandler.java:404)
在 org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.createResponse(JAXWSProxyHandler.java:497)
在 org.apache .axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:208)
根据 Spring 默认行为,每当抛出异常时,它都会尝试回滚。这就是它正在尝试的,但不知何故无法回滚。由于它是使用注释的声明性事务,我如何跟踪此异常的确切原因?基于异常,我肯定知道 DAO 类方法正在抛出异常。但我无法跟踪确切原因(无论是连接关闭问题还是其他任何事情)。我只想在 DAO 类中使用异常处理以便知道确切的原因。我可以在 DAO 类方法中使用 try/catch 块来打印确切原因的堆栈跟踪吗?我只是想再次提醒一下,它一直工作正常,但有时因为这个异常而无法工作。
我希望我清楚地解释了我的问题。请通过提供解决方案来做必要的事情。