- 字符串转其他类型时,要处理转换异常
- 禁止空指针异常
- 依赖于先前值得更新要处理并发情况(分布式锁或消息队列处理)
- 要处理数据库无法存储的特殊字符
- 小数计算要用BigDecimal
- else 部分必须处理(哪怕只打印debug日志)
- 接口要保证幂等
- 耗时接口要限制调用频率
- 循环中禁止单记录查询
- 批量保存要写在事务中
- 禁止sql子查询
- 禁止sql超过3个表的关联
- 禁止在事务中处理耗时操作(事务中调用外部接口)
- 获取大量数据并处理时,必须分批,不能一次获取
- 应该建立字典表记录枚举列字段
- OLTP业务查询应该查主库
- 存储日期时字段时,如果精确到秒,则不应该直接将new Date()传入数据库(new Date()精度到毫秒)
- 禁止打印大数据量日志
- 在使用redis锁(setNx)时,必须获取到锁,才能释放锁
这种写法是错误的
try {
AssertUtil.service(!JedisUtils.lock(key), "重复请求");
} catch (Exception e) {
rsp.setFailMsg("系统异常");
e.printStackTrace();
} finally {
if (StringUtils.isNotBlank(key)) {
JedisUtils.del(key);
}
}
修改如下
boolean isLock=false;
try {
isLock=JedisUtils.lock(key);
AssertUtil.service(!isLock, "重复请求");
} catch (Exception e) {
rsp.setFailMsg("系统异常");
e.printStackTrace();
} finally {
if (StringUtils.isNotBlank(key)&&isLock) {
JedisUtils.del(key);
}
}
- 禁止使用动态值判断
if(new Date())
elseif(new Date())
- 更新表记录时,只更新需要更新字段,禁止无理由的全部字段更新
- 返回错误值时要打印日志
if (genderMappingBO == null) {
v.setSyncResult(false);
return null;
}
- 禁止在事务中写异步流程
- 明确小数保留位数
- 明确保留小数位是每一步保存,还是最后计算结果保存
- 锁要在事务结束后才能释放
- 一个业务涉及多个流程,每个流程都应try{}catch(){}来确保流程独立,至于某个流程出现错误后是否终止业务,则需具体判断
- 禁止以页面结构来设计接口响应数据结构
- 数据长度验证,避免too long异常