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

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

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

java后端处理高并发的更多相关文章

  1. JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案

    JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案

  2. java 关于多线程高并发方面

    转有关的文章链接: Java 高并发一:前言: http://www.jb51.net/article/92358.htm Java 高并发二:多线程基础详细介绍 http://www.jb51.ne ...

  3. 使用Redis中间件解决商品秒杀活动中出现的超卖问题(使用Java多线程模拟高并发环境)

    一.引入Jedis依赖 可以新建Spring或Maven工程,在pom文件中引入Jedis依赖: <dependency> <groupId>redis.clients< ...

  4. Java 架构师+高并发+性能优化+Spring boot大型分布式项目实战

    视频课程内容包含: 高级 Java 架构师包含:Spring boot.Spring cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.Zer ...

  5. Java面试处理高并发

    经过查资料,方案如下所示.   1 从最基础的地方做起,优化我们写的代码,减少必要的资源浪费.           a.避免频繁的使用new对象,对于整个应用只需要存在一个实例的类,我们可以使用单例模 ...

  6. Java优化高性能高并发+高并发程序设计视频教程

    转自:https://www.cnblogs.com/ajianku/p/10236573.html 第1章 课程介绍及项目框架搭建1-1 Java高并发商城秒杀优化导学1-2 项目环境搭建(Ecli ...

  7. Java面试之高并发系统

    在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.

  8. java一般处理高并发的技术手段

    应对高并发的解决方案: 1.将压力放在数据库上面,添加行级锁. select * from table for update; 2.将压力放在应用程序上面,对方法加synchronized同步.

  9. JAVA多线程下高并发的处理经验

    java中的线程:java中,每个线程都有一个调用栈存放在线程栈之中,一个java应用总是从main()函数开始运行,被称为主线程.一旦创建一个新的线程,就会产生一个线程栈.线程总体分为:用户线程和守 ...

随机推荐

  1. Python - Django - ORM 自定义表名

    通过 Django 建立的表 命名方式为:项目名_表名 可以将该默认命名方式进行修改 models.py: from django.db import models class Person(mode ...

  2. kubernetes&prometheus 【组件】

    查看prometheus target页面可得组件 kube-state-metric: https://github.com/kubernetes/kube-state-metrics/blob/m ...

  3. iOS-关于创建真机调试证书(发布证书,测试证书,推送调试证书)【转】

  4. Python机器学习基础教程

    介绍 本系列教程基本就是搬运<Python机器学习基础教程>里面的实例. Github仓库 使用 jupyternote book 是一个很好的快速构建代码的选择,本系列教程都能在我的Gi ...

  5. sql 查找最晚入职员工

    题目描述 查找最晚入职员工的所有信息CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`fi ...

  6. mysql 严格模式 Strict Mode

    mysql 严格模式 Strict Mode 找到MySQL安装目录下的my.cnf(windows系统则是my.ini)文件 在sql_mode中加入STRICT_TRANS_TABLES则表示开启 ...

  7. 虚拟机中使用Samba实现文件共享

    首先我们给虚拟机安装samba服务(如果搭的是别的仓库记得开仓库) 输入命令:yum install samba samba服务的配置文件在,我们来看一下/etc/samba/smb.conf 输入命 ...

  8. 用pytorch1.0搭建简单的神经网络:进行多分类分析

    用pytorch1.0搭建简单的神经网络:进行多分类分析 import torch import torch.nn.functional as F # 包含激励函数 import matplotlib ...

  9. [EF] - "已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭" 之解决

    错误 解决 在 ConnectionString 中添加 MultipleActiveResultSets=true(适用于SQL 2005以后的版本).MultipleActiveResultSet ...

  10. Spring Security 官网文档学习

    文章目录 通过`maven`向普通的`WEB`项目中引入`spring security` 配置 `spring security` `configure(HttpSecurity)` 方法 自定义U ...