java后端处理高并发

一个登陆页面可能会被很多账户同时登陆或者注册,那么我们就好处理这些并发,否则降低程序的使用率,甚至程序奔溃,下面一段代码处理程序的高并发效果不错。

/**
*@author xiaoxie
*@date create 2019/9/17
*@return
* 处理高并发
*/
public class RequestHolder {

// 线程处理
private static final ThreadLocal userHolder = new ThreadLocal();

// 登录
private static final ThreadLocal requestHolder = new ThreadLocal();

// 设置登陆用户
public static void add(SysUser sysUser){
userHolder.set(sysUser);
}

public static void add(HttpServletRequest request) {
requestHolder.set(request);
}

// 处理当前用户
public static SysUser getCurrentUser() {
return userHolder.get();
}

// 处理当前登录
public static HttpServletRequest getCurrentRequest() {
return requestHolder.get();
}

// 消亡
public static void remove(){
userHolder.remove();
requestHolder.remove();
}
}

注意:SysUser是自己定义的model,根据自己的需要设置。

在登陆或者注册完成之后就要消亡,否则会产生数据的溢出。

/**
*@author xiaoxie
*@date CREATE 2019/9/6 UPDATE 2019/9/12
*@return 请求前后监听
*/
@Slf4j
public class HttpInterceptor extends HandlerInterceptorAdapter {

private static final String START_TIME = "requestStartTime";

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI().toString();
Map parameterMap = request.getParameterMap();
log.info("request start. url:{}, params:{}", url, JsonMapper.obj2String(parameterMap));
long start = System.currentTimeMillis();
request.setAttribute(START_TIME, start);
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// String url = request.getRequestURI().toString();
// long start = (Long) request.getAttribute(START_TIME);
// long end = System.currentTimeMillis();
// log.info("request finished. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String url = request.getRequestURI().toString();
long start = (Long) request.getAttribute(START_TIME);
long end = System.currentTimeMillis();
log.info("request completed. url:{}, cost:{}", url, end - start);

removeThreadLocalInfo();
}

public void removeThreadLocalInfo() {
RequestHolder.remove();
}

通过过滤器进行实现

/**
*@author xiaoxie
*@date create 2019/9/17
*@return
*
* 登陆过滤
*/
@Slf4j
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;

SysUser sysUser = (SysUser) req.getSession().getAttribute("user");

if (sysUser == null){
String path = "/signin.jsp";
resp.sendRedirect(path);
return;
}

// 处理高并发
RequestHolder.add(sysUser);
RequestHolder.add(req);
filterChain.doFilter(servletRequest,servletResponse);
return;
}

@Override
public void destroy() {

}
}

简单的高并发就处理好了。

posted on 2019-09-17 17:01  xsDao  阅读(3984)  评论(0)    收藏  举报