我不得不取消正在运行的查询。在我的DAO中,我在启动查询时在Entity.session
中设置ServletContext
,并在查询完成后将其删除。然后检查Controller
ServletContext
中是否存在会话,如果存在,则通过调用session.cancelQuery()
中会话对象的ServletContext
取消查询
这在我的开发环境中工作正常,但在我的pre-prod测试中,整个代码不会在tomcat容器中运行。 Web部件在tomcat中运行,而数据层在java应用程序中运行。因此我在DAO课程中找不到ServletContext
,它给了我一个ClassNotFound
异常
所以我在DAO中解耦了web层。现在,当我调用DAO hibernate.session
时,我在控制器本身设置了calculate()
。但这造成了一个问题,即使没有进行计算,现在会话仍然存在,实际上有一些帖子或预先计算。我取消查询的机制不起作用。
所以我需要的是一种从Controller
访问DAO
以设置会话的方法。我可以在Controller中使用静态方法,然后从中设置会话,但我认为这也不是一个好习惯。
DAO初始代码:
public calculate(){
Session session = mEntityManager.unwrap(Session.class);
//pre possing
if(session != null)
{
mContext.setAttribute(""+view.getId(), session);
}
List<Object[]> results = query.getResultList();
mContext.removeAttribute(""+view.getId());
//post processing
}
解耦的DAO代码:
在控制器中调用calculate方法之前,从控制器调用方法getSession()。然后,当用户从UI请求取消时,在控制器中调用cancel
方法。
public Session getSession()
{
Session session = mEntityManager.unwrap(Session.class);
return session;
}
public calculate(){
//pre possing
List<Object[]> results = query.getResultList();
//post processing
}
控制器:
@RequestMapping
public WebServiceResponse cancel(HttpServletRequest request)
{
if(mContext.getAttribute(id) != null)
((Session)mContext.getAttribute(id)).cancelQuery();
}
答案 0 :(得分:0)
似乎你有一个复杂的控制流,因为你没有正确地将问题的检测与处理问题分开:你检测到数据层中的问题,但需要在表示层中处理它。
考虑使用例外。让数据层在检测到问题时抛出异常。表示层可以通过捕获异常来处理数据层中的问题。