开发笔记
代码开发
1、不要把服务器路径返回给前端
2、数据请求参数在后端作一定的校验,记住前端是不可靠的
3、限制查询条数,提前过滤掉不当请求
4、拿到的数据记得做非空校验,特别是之后要调用这个对象的方法的时候
5、每个查询sql最后务必按时间和主键order by,防止分页出现数据重复的问题
6、调用第三方接口时,要确保生产环境是否能够调通
后端调用接口
try {
Req req = new Req();
req.setId(Id);
log.info("调用接口, Id: {}", Id);
String repsonse = HttpTemplates.create()
.headers(getRequestHeader())
.url(url)
.body(JsonUtils.toJsonString(req))
.post();
ResponseMsg<String> responseMsg = new ObjectMapper().readValue(repsonse, TypeFactory.defaultInstance().constructType(new TypeReference<ResponseMsg<String>>() {}));
if (!CODE_SUCCESS.equals(responseMsg.getCode())) {
throw new AppException(MessageFormat.format("调用接口失败, Id: {}", Id));
}
String price = responseMsg.getData();
log.info("调用接口结束, Id: {}", Id);
} catch (Exception e) {
log.error("调用接口失败", e);
}
缓存处理
前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
一、缓存穿透
大量并发请求缓存和数据库中都没有的数据。
二、缓存击穿
大量并发请求同一条数据,但该数据缓存中没有但数据库中有。
三、缓存雪崩
大量并发请求不同数据,这些数据缓存中没有但数据库中有。
四、解决方案
1、Controller层增加校验,如用户鉴权校验,id基础校验 。
2、设置热点数据永远不过期。
3、对数据加互斥锁,保证其中一个请求去数据库中取数据时,其他线程等待,最后从缓存中取数据。
4、缓存数据的过期时间设置随机。
5、热点数据均匀分布在不同的数据库中。
Java各种对象
VO:值对象(Value Object),通常用于业务层之间的数据传递。
表现层对象(View Object),主要对应展示界面显示的数据对象。
PO:持久对象 (persistent object),就是在Object/Relation Mapping(orm) 框架中的Entity,PO的每个属性基本上都对应数据库表里面的某个字段。
DTO:数据传输对象(Data Transfer Object),我们不需要把整个PO对象全部字段传输到客户端,而是可以用DTO重新封装,传递到客户端。此时,如果这个对象用来对应界面的展现,就叫VO。
POJO:POJO(Plain Ordinary Java Object)简单的Java对象。一个POJO持久化以后就是PO,直接用它传递、传递过程中就是DTO,直接用来对应表示层就是VO
DAO: 数据访问对象(Data Access Object),就对应了Mybatis的Mapper接口