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() {
	    
	        }
	    }

簡單的高並發就處理好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM