Web常见系统性能分析
1. 避免for中频繁调用数据库连接进行增删改查;
在循环中频繁调用数据库连接去进行数据的CRUD,会大大拖慢系统的运行速度,严重影响用户体验,甚至导致内存泄漏;试验表明,在for中写CRUD方法可能会导致系统慢上10倍及其以上;
- 使用略微复杂一点的SQL语言来代替频繁的在代码中CRUD;
- 使用MyBatis的一对多查询,多对多查询;
- 尝试使用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);
}
}
直接采用类名.方法名
的方式去调用
tip: 不用重复造轮子,有很多现成的工具类已经很完善了,比如以下:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.22</version> </dependency> <!-- 包含一些通用的编码解码算法. 如:MD5、SHA1、Base64等 --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.13</version> </dependency> <!-- 包含丰富的工具类如 StringUtils --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </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. 多看开源代码吧
其实有很多方法不是固定的,需要我们具体问题具体分析,从解决方案的角度来说,列出几套方案,从中选优,没有什么性能好坏,只有合适和不合适,取舍问题罢了。。。
这里推荐一个开源代码
同时推荐 《阿里巴巴编码规范》以及配套插件,会检查代码质量;以及代码不规范的地方!