你需要将数据库线程池的大小设置为 1(id it let's you),并将 Servlet 设置为单线程,但是队列没有保证,可能队列中的第二个在第一个之前,并且为什么需要这样做?
另一种方法是每个请求都由一个 servlet 过滤器过滤,该过滤器从开始到结束响应锁定一个同步对象,这确保您没有任何其他线程会获取锁定并执行相同操作(至少对于 http 请求)
servlet 单线程模式:
public class AloneServlet extends HttpServlet implements SingleThreadModel {
//....
}
the servlet filter approach
public final class HitCounterFilter implements Filter {
private Object lock=new Object();
//...
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)
synchronized(lock){
chain.doFilter(request, wrapper);
}
}
}
上面的两个示例是针对 http 请求的,您需要对 Web 服务等执行相同操作。
请说明您为什么希望您的服务器使用单线程,也许有更多更好的方法可用,我从不建议这些方法:)
方法 2:
先编码过滤器代码
package com.stackoverflow.supportbuddy
import javax.servlet.*;
import javax.servlet.http.*;
// Implements Filter class
@ServletFilter(urlPatterns={"/pages/myJSP.jsp"})// for Java EE 6+
public class SyncFilter implements Filter {
public void init(FilterConfig config)throws ServletException{}
@Override
private static Object lock=new Lock();
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws java.io.IOException, ServletException {
//each thread needs to lock the "lock" object and this ensures you only one thread will be forwarded.
synchronized(lock){
chain.doFilter(request,response);
}
}
@Override
public void destroy( ){}
}
然后将过滤器映射到所需的jsp文件,例如如果jsp文件位于/pages文件夹下,那么您需要在web.xml中像这样映射过滤器或在较新版本的Java EE中使用注释
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
.....
<filter>
<filter-name>SycnFilter</filter-name>
<filter-class>com.stackoverflow.supportbuddy.SyncFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SycnFilter</filter-name>
<url-pattern>/pages/myJSP.jsp</url-pattern>
</filter-mapping>
.....
</web-app>
终于试一试了:)