Javaservlet在提交数据库事务之前将响应返回给客户机
我使用第三方框架通过将HttpServletRequest和HttpServletResponse传递到框架中来处理我的请求。数据库事务处理与框架分开进行,如下所示:Javaservlet在提交数据库事务之前将响应返回给客户机,java,servlets,transactions,Java,Servlets,Transactions,我使用第三方框架通过将HttpServletRequest和HttpServletResponse传递到框架中来处理我的请求。数据库事务处理与框架分开进行,如下所示: public class MyServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletExc
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
startTransaction();
framework.process(req, resp);
commitTransaction();
}
}
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
startTransaction();
chain.doFilter(request, wrapper);
commitTransaction();
}
事实证明,在调用commitTransaction()
返回之前,框架会将完整响应写回客户端。这会产生可能的竞争条件:客户端可能会发出一个后续请求,该请求在第二个新数据库事务中运行,该事务无法访问在第一个事务中添加或更新的数据,因为它尚未提交
解决这些问题的最佳实践是什么?我无法修改我正在使用的框架的行为。我建议对此类问题使用。它看起来是这样的:
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
startTransaction();
framework.process(req, resp);
commitTransaction();
}
}
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
startTransaction();
chain.doFilter(request, wrapper);
commitTransaction();
}
但是,您应该向筛选器添加异常处理。在framework.process中,传递一个响应包装器实例-当客户端尚未收到第一个请求的响应时,为什么要发出另一个请求?@BalajiKrishnan谢谢!这看起来很有希望@wero因为
framework.process(…)
直接写入响应。在调用服务器上的commit之前,客户端可能会收到完整长度的响应