Web系统性能分析

Web常见系统性能分析

1. 避免for中频繁调用数据库连接进行增删改查;

在循环中频繁调用数据库连接去进行数据的CRUD,会大大拖慢系统的运行速度,严重影响用户体验,甚至导致内存泄漏;试验表明,在for中写CRUD方法可能会导致系统慢上10倍及其以上;

  1. 使用略微复杂一点的SQL语言来代替频繁的在代码中CRUD;
  2. 使用MyBatis的一对多查询,多对多查询;
  3. 尝试使用Java8的Stream和parallelStream流式处理;

2. 避免在HTML文件中引入CDN、远程的JS

错误例子如下

<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.9.0/bootstrap-table.min.css">

应将Js库下载到本地引入,避免系统上线后可能因为网络波动导致访问不到远程Js,导致系统加载缓慢;

正确例子如下:

<script src="/static/js/jquery-3.2.1.min.js">script>

3. 常量定义为 public static final T t = xx

Java 中使用 final static 这种方式定义常量的理由

4. Java工具类最好定义为静态类

例如:

/**
 * 用于高精确处理常用的数学运算
 *
 * @author dxz
 */
public class ArithmeticUtils {
   //默认除法运算精度
   private static final int DEF_DIV_SCALE = 10;

   //这个类不能实例化
   private ArithmeticUtils() {
   }

   /**
    * 提供精确的加法运算
    *
    * @param v1 被加数
    * @param v2 加数
    * @return 两个参数的和
    */
   public static double add(double v1, double v2) {
      BigDecimal b1 = new BigDecimal(Double.toString(v1));
      BigDecimal b2 = new BigDecimal(Double.toString(v2));
      return b1.add(b2).doubleValue();
   }

   /**
    * 提供精确的加法运算
    *
    * @param v1 被加数
    * @param v2 加数
    * @return 两个参数的和
    */
   public static BigDecimal add(String v1, String v2) {
      BigDecimal b1 = new BigDecimal(v1);
      BigDecimal b2 = new BigDecimal(v2);
      return b1.add(b2);
   }
}

直接采用类名.方法名的方式去调用

为什么Java工具类方法为静态类?

tip: 不用重复造轮子,有很多现成的工具类已经很完善了,比如以下:

<dependency>
 <groupId>org.projectlombokgroupId>
 <artifactId>lombokartifactId>
 <version>1.16.22version>
dependency>

<dependency>
 <groupId>commons-codecgroupId>
 <artifactId>commons-codecartifactId>
 <version>1.13version>
dependency>

<dependency>
 <groupId>org.apache.commonsgroupId>
 <artifactId>commons-lang3artifactId>
 <version>3.9version>
dependency>

通过引入这些jar,我们很容易对集合,加密,字符串进行一些判空,截取,转换等操作,不用自己手写了,直接调函数就行;除此之外,还有一个国产的强烈推荐,基本上涵盖了以上所有的包

Hutool 强烈推荐!

5. 减少代码冗余

对一些常用的代码可以将它抽象出来做一个父类或者其他什么的,如果其他类要用到,直接继承该类就好;

减少代码冗余量,比如检查用户是否登录的函数可以如下设计:

// 创建Base接口,封装常用方法
public class BaseController {
    protected Logger logger = LogManager.getLogger(BaseController.class);
    /**
     * 判断用户是否登录
     *
     * @param httpServletRequest 浏览器请求
     * @return 成功返回id, 不成功返回null
     */
    protected String CheckLogin(HttpServletRequest httpServletRequest) {
        HttpSession session = httpServletRequest.getSession(false);
        if (session == null) {
            logger.info("用户未登录!");
            return null;
        }
        String userId = (String) session.getAttribute("userId");
        if (userId == null) {
            logger.info("用户未登录!");
            return null;
        }
        logger.info("用户已经登录,用户ID为{}", userId);
        return userId;
    }
}
// 若用到BaseController中的方法,继承即可;同时可用于多个类,只需继承BaseController即可
@RestController
public class UserInfoController extends BaseController{
   @Autowired
   private UserInfoService userInfoService;
 
   @RequestMapping("/checkLogin")
   public Result queryAll(HttpServletRequest httpServletRequest) {
      String userId = CheckLogin(httpServletRequest);
      if (userId==null){
         return Results.failure("nologin");
      }else{
         return Results.success("yeslogin");
      }
   }
}

tip:多类多方法,一个类尽量出去注释以外不要超过80行<阿里巴巴编码规范规定> ;多建几个类,几个方法;

编码的时候多想想 面向对象:封装、继承、多态—》从而提高代码复用

6. 多用设计模式

https://www.runoob.com/design-pattern/design-pattern-tutorial.html

7. 多看开源代码吧

其实有很多方法不是固定的,需要我们具体问题具体分析,从解决方案的角度来说,列出几套方案,从中选优,没有什么性能好坏,只有合适和不合适,取舍问题罢了。。。

这里推荐一个开源代码

新蜂商城

同时推荐 《阿里巴巴编码规范》以及配套插件,会检查代码质量;以及代码不规范的地方!

你可能感兴趣的:(技术专栏,java,数据库)