阿里Java开发手册学习笔记(二)----异常日志、MySql规约

学习阿里Java开发手册笔记系列,参考版本1.0.0
在线阅读:https://img.hacpai.com/file/2017/1/eb0998bac7664496b2f1af98e07b08e5-Java.pdf
最新版本下载:http://click.aliyun.com/m/10355/

一、异常处理

  1. 不捕获Java类库中定义的继承自RuntimeException的运行时异常类。此类异常应由程序员预检查规避。
  2. 异常不要用来做流程控制,效率太低。
  3. 对非稳定代码的catch尽可能区分异常类型,再做对应的异常处理。
  4. 捕获了异常应该及时处理或者将之抛给方法调用者。最外层业务使用者必须处理异常。
  5. 有try块放到了事务代码中,catch异常后,如需回滚事务,需要手动回滚。
  6. finally块需对使用的资源进行关闭与释放。
  7. 方法的返回值可以为空时,需要注明什么时候返回空值。
  8. 防止NPE(NullPointerException),注意NPE产生的场景。
  9. 对外开放的接口使用错误码,应用内部使用异常。跨应用RPC调用优先使用Result方式,封装isSuccess,错误码,错误信息。

二、日志规约

  1. 应用中不可以直接使用日志系统(Log4j,Logback)中的API,而应该依赖使用的日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护各个类日志处理方式的同一。
  2. 日志文件推荐至少保存15天。有些异常有以周为频次的发生特点。
  3. 应用中扩展日志的命名方式:appName_logType_logName.log
    推荐分类有stats/desc/monitor/visit等。
  4. 对于trace/debug/info级别的日志输出,必须使用条件输出形式或者占位符方式,避免系统资源浪费。
  5. 异常信息包含两类:a.现场信息(对象toString) b.异常堆栈信息。

三、建表规约

  1. 表达是与否概念字段时使用is_xxx方式命名,类型为unsigned tinyint。
  2. 表名字段名必须使用小写字母或数字;禁止数字开头,禁止两个下划线之间只出现数字。表名不使用复数形式。
  3. 唯一索引名为uk_字段名,普通索引名为idx_字段名。
  4. 小数类型为decimal,不使用float和double。存在精度损失。
  5. 存储字符串长度基本相等时使用CHAR定长字符串类型。
  6. varchar为可变长字符串类型,不预先分配空间,长度不超过5000,否则应该独立一张表,使用TEXT类型,用主键对应。
  7. 三个必备字段,id(unsigned bigint)、gmt\_create(date\_time)、gmt\_modified(date\_time)
  8. 单表行数超过500w行时或者单表容量超过2G时,才推荐进行分库分表。

四、索引规约

  1. 业务上具有唯一特性的字段,即使是组合字段,也要建成唯一索引。
  2. 超过3个表禁止join。需要join的字段,数据类型保持一致,多表关联查询时,保证被关联的字段需要有索引。
  3. 在varchar字段上建立索引时,指定索引长度。
  4. 页面搜索严禁左模糊或者全模糊。
  5. 利用覆盖索引进行查询操作,避免回表操作。
  6. 利用延迟关联或子查询优化超多分页情况。
  7. 建立组合索引时,区分度高的在左边。

五、SQL规约

  1. 不要使用count列名或者常量来取代count(*)。
  2. count(col)不计算此列数据为NULL的记录,但是返回0。sum(col)返回null。
  3. 使用ISNULL()判断是否为NULL值,NULL与任何值直接比较都为NULL。
  4. 外键与级联更新只适合单机低并发,高并发集群影响效率。因而不使用外键与级联,外键概念在应用层解决。
  5. 禁止使用存储过程,因为难以调试与扩展,没有移植性。
  6. IDB数据订正时,删除修改时,要先select,避免误删。
  7. 尽量避免in操作,实在要用控制in后集合元素数量在1000以内。
  8. 不建议在开发中使用truncate table,尽管速度快于delete。它无事物不触发trigger,可能造成事故。

六、ORM规约

  1. 表查询时,一律不要使用*作为查询字段列表,以免增加解析成本、删减字段与resultMap配置不一。
  2. POJO类boolean字段不加is,数据库字段则要加is_前缀。
  3. 更新数据表记录时同时更新gmt_modified字段为当前时间。
  4. 不要写大而全的数据更新接口,即传入POJO对象,对表的每个字段都进行更新。这样容易出错且效率低。

你可能感兴趣的:(阿里Java开发手册学习笔记(二)----异常日志、MySql规约)