欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL数据库优化

程序员文章站 2022-09-28 17:58:47
SQL数据库优化。 1.【强制】不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象...

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。