1. 逻辑代码
1.1 基础开发
1.1.1 参数校验
- 入参基本校验:金额不能小于0、不能大于余额、不能大于应还总额等。
- 
字符串非空。 
- 
请求参数用 POJO 接收,POJO 的属性要添加基本校验注解,Controller 方法要用 @Valid注解开启校验。
- 
正则表达式:用正则表达式进行参数校验时,不能写太复杂的,因为 Java 的正则引擎采用的是贪婪匹配模式。 
1.1.2 跨系统调用
- 
超时限定:为了防止外部服务出现响应缓慢而拖累调用方,调用方必须设置连接超时、读超时等。 
- 
幂等性,防止重复调用:调用方传递唯一的请求编号、服务方根据请求编号进行幂等性控制; 
- 
重试:对于重要业务,调用方应该有重试机制,重试一定次数后仍然失败的,有告警出来,人工介入处理。 
- 
调用链跟踪: 
1.2 SQL
- 
检查SQL语句的执行计划,关注是否有全表扫描、索引全扫描。 
- 
尽量把 1+N 次查询改写成 1或2 次查询。 
- 
不能在字段上应用函数。 
- 
字段应该单独在比较运算符的左侧。 
- 
检查是否有隐式类型转换 - 隐式类型转换会对扫描到的每条记录的字段进行转换,然后再进行比较,执行性能较慢,还会导致无法使用被转换列上的索引。
- 比如 varchar(10)类型的字段用abc=40则会进行隐式类型转换,abc='40'则不会。
- MyBatis在处理数据库 Date类型时只能传TIMESTAMP。 类型,与Oracle的Date类型进行比较会导致隐式转换。
- MySQL 里如果比较的两个字符串列的字符集不同也会发生隐式类型转换。
 
- join的连接条件不要放到 where 子句,连接条件与过滤条件的执行顺序不同。