zoukankan      html  css  js  c++  java
  • java后端处理高并发

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

    		    		/**
    		    *@author xiaoxie
    		    *@date create 2019/9/17
    		    *@return
    		     * 处理高并发
    		    */
    		    public class RequestHolder {
    		    
    		    //    线程处理
    		        private static final ThreadLocal<SysUser> userHolder = new ThreadLocal<SysUser>();
    		    
    		    //    登录
    		        private static final ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<HttpServletRequest>();
    		    
    		    //    设置登陆用户
    		        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() {
    	    
    	        }
    	    }
    

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

  • 相关阅读:
    Bump Mapping综述 (转)
    二进制表示(转)
    3D局部光照模型 (转)
    关于DEVMODE的数据结构显示设备的属性(转)
    The C++ Programming Language(一)
    The C++ Programming Language(二)
    linux_redhat9下安装FTP服务器
    oracle下用户相关问题整理
    Linux的基本命令学习与shell基本内容学习(2)
    winxp系统32位平台下利用oracle10g自带的DBCA(database configuration assistant)工具创建数据库
  • 原文地址:https://www.cnblogs.com/XSdao/p/11535340.html
Copyright © 2011-2022 走看看