无处不在的空指针
1. 包装类拆包时的空指针,注意对象转换或者对象填充时的数据类型,会不会需要拆包Integer i = null;int j = i;
2. 级联调用,注意判断父级是否为空A.getC().getD();
3. 所有的外部对象都不是那么可信,即使是自己写的填充的对象,有时候也不是那么可信,可能因为数据库中没有该字段的非空约束,导致数据源本来就是空的
4. 工具类使用时防止参数的空导致空指针问题,如Map , BigDecimal类的相关方法
多层嵌套逻辑导致的逻辑错误
1. 现象:循环里面套判断,判断里面又是循环。。。,循环体,判断体还很长,还跨方法嵌套
2. 问题:增加代码阅读难度,业务理解难度,问题排查难度
3. 解决:
1. 对于较长的业务代码进行抽取,并使用一个有意义的名字,使得阅读代码能更加连贯,简单
2. 理清业务逻辑
事务问题
1. 远程服务调用,导致事务无效,现并没有支持分布式事务(业务处理逻辑写在web中,服务由service 提供,web 远程调用service服务,web 中的业务无法实现对service服务的事务管理)
2. 同一个类内,无事务的publish方法调用有事务的publish方法,事务无效
3. com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction : 事务方法执行时间过长导致数据被锁,其他事务获取锁超时
fullgc
1. 避免查询条件失效,或者条件辨识度太低,导致拖库
2. 导出功能,分批查询,分批填充,流式导出(SXSSFWorkbook,避免大量数据写入内存,将超过部分数据写入磁盘)
3. 定时任务的查询条件,先再线上查询一遍,看大概的数据量
BigDecimal错误
1. a.divide(b); 除法未指定策略(保留小数位,四舍五入)
查询失效
1. 问题描述:本来應該查询到结果的,但是没有查询到
2. 原因:
1. 关联查询尽量使用id,而不要使用name 这些易变的字段进行查询,防止改变后查询不到相关结果
jdbc,redis 等拿不到连接
1. 原因:
1. 连接未释放,连接数量不足
1. redis scan 使用完后需要关闭资源,释放连接
批量补数据注意点
1. 如果线下无法验证后门正确性,先修复少量数据,然后做验证,避免后门有问题,修数据导致数据批量有问题
基本类型的包装类
1. 千万千万不要 用 == 比较基本类型的包装类