SQL数据库优化
SQL数据库优化。
1.【强制】不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
2.【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。
3.【强制】Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
4.【强制】long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
5.【强制】不允许出现任何魔法值(即未经定义的常量)直接出现在代码中。
6.【强制】使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。
7.【强制】高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。
8.【强制】对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁。
9.【强制】并发修改同一记录时,避免更新丢失,要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用version作为更新依据。
10.【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
11.【强制】后台输送给页面的变量必须加$!{var}——中间的感叹号。
12.【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
13.【强制】避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false。
14.【强制】 超过三个表禁止join。需要join的字段,数据类型保持绝对一致;多表关联查询时,保证被关联的字段需要有索引。
15.【强制】不要使用count(列名)或count(常量)来替代count(*),count(*)就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。
16.【强制】count(distinct col) 计算该列除NULL之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。
17.【强制】当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,因此使用sum()时需注意NPE问题。
18.【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
19.【强制】数据订正时,删除和修改记录时,要先select,避免出现误删除,确认无误才能执行更新语句。
20.【强制】用户请求传入的任何参数必须做有效性验证。
21.【强制】不要捕获Java类库中定义的继承自RuntimeException的运行时异常类。
【推荐】防止NPE,是程序员的基本修养,注意NPE产生的场景:
1) 返回类型为包装数据类型,有可能是null,返回int值时注意判空。 反例:public int f(){ return Integer对象}; 如果为null,自动解箱抛NPE。
2) 数据库的查询结果可能为null。
3) 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。
4) 远程调用返回对象,一律要求进行NPE判断。
5) 对于Session中获取的数据,建议NPE检查,避免空指针。
6) 级联调用obj.getA().getB().getC();一连串调用,易产生NPE。