异常处理
- Java 类库中定义的一类RuntimeException可以通过预先检查进行规避,而不应该通过catch 来处理,比如:IndexOutOfBoundsException,NullPointerException等等。
- 异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。
- catch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。
- 捕捉到的异常如果不处理就把它抛给调用者。
- 捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。
日志规约
- 应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
- 对trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符的方式。
(占位符)
logger.debug("Processing trade with id: {} symbol : {} ", id, symbol);
- 避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false。
- 异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。
- 谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志。避免随意输出日志。
MySQL数据库
- 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。
- 表名不使用复数名词。
- 主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名。
- 小数类型为decimal,禁止使用float和double,否则会造成精度缺失。
- varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
- 表必备三字段:id(主键), gmt_create(创建时间), gmt_modified(修改时间)。
- 表的命名最好是加上“业务名称_表的作用”。
- 单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。
MySQL语句
- count(*)是SQL92定义的标准统计行数的语法,速率最快,统计为null的值。
- count(列名)则不会统计null值。count(distinct col) 计算该列除NULL之外的不重复行数,注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。
- 当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,因此使用sum()时需注意NPE问题。
- 在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
- in操作能避免则避免,效率极低。
- 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。(可以减少查询分析器解析成本)
- 不允许直接拿HashMap与Hashtable作为查询结果集的输出。(值得类型不可控)
- 更新数据表记录时,必须同时更新记录对应的gmt_modified字段值为当前时间。
- 执行SQL时,不要更新无改动的字段,一是易出错;二是效率低;三是增加binlog存储。