阿里巴巴Java开发手册

来源:互联网 发布:怎么关掉电脑445端口 编辑:程序博客网 时间:2024/06/01 09:41

日志规约

  1. [强制]应用中不可直接使用日志系统(Log4j,Logback)中的API,而应该依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一.
  2. [强制]日志文件推荐至少保存15天,因为有些异常具备以”周”为频次发生的特点.
  3. [强制]应用中的扩展日志(如打点,临时监控,访问日志等)命名方式:
    appName_logType_logName.log:logType:日志类型,推荐分类有stats/desc/monitor/visit等;logName:日志描述.这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找.
    说明: 推荐对日志进行分类,错误日志和业务日志尽量分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控.
  4. [强制]对trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符的方式.
  5. [强制]避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置addtivity=false.
  6. [强制]异常信息应该包含两类信息:案发现场信息和异常堆栈信息.如果不处理,那么往上抛.
  7. [推荐]可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从.注意日志输出的级别,error几倍只记录系统逻辑出错,异常等重要的错误信息.如非必要,请不要再此场景打出error级别.
  8. [推荐]谨慎地记录日志.生产环境禁止输出debug日志:有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志.
    说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点.

建表规约

  1. [强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否),此规则同样适用于odps建表.
    说明:任何字段如果为非负数,必须是unsigned.
  2. [强制]表名,字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字.数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑.
  3. [强制]表名不使用复数名词.
    说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于DO类名也是单数形式,符合表达习惯.
  4. [强制]禁用保留字,如desc,match,delayed等,请参考MySQL官方保留字.
  5. [强制]唯一索引名为uk_字段名;普通索引名为idx_字段名.
  6. [强制]小数类型为decimal,禁止使用float和double.
    说明:float和double在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果.如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储.
  7. [强制]如果存储的字符串长度几乎相等,使用char定长字符串类型.
  8. [强制]varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其他字段索引效率.
  9. [强制]表必备三字段:id,gmt_create,gmt_modified.
    说明:其中id为主键,类型为unsigned bigint,单表时自增,步长为1.gmt_create,gmt_modified的类型均为data_time类型.
  10. [推荐]表的命名最好是加上”业务名称_表的作用”.
  11. [推荐]库名与应用的名称尽量一致.
  12. [推荐]如果修改字段含义或字段表示的状态追加时,需要及时更新字段注释.
  13. [推荐]字段允许适当冗余,以提高性能,但是必须考虑数据同步的情况.冗余字段应遵循:
    1) 不是频繁修改的字段
    2) 不是varchar超长字段,更不能是text字段.
  14. [推荐]单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表.
  15. [参考]合适的字符存储长度,不但节约数据库表空间,节约索引存储,更重要的事提升检索速度.

索引规约

  1. [强制]业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引.
    说明:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了非常完善的校验和控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生.
  2. [强制]超过三个表禁止join.需要join的字段,数据类型保持绝对一致;多表关联查询时,保证被关联的字段需要有索引.
    说明:即使双表join也要注意表索引,SQL性能.
  3. [强制]在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度.
    说明:索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使用count(distinct left(列名,索引长度))/count(*)的区分度来确定.
  4. [强制]页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决.
    说明:索引文件具有B-Tree的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引.
  5. [推荐]如果有order by的场景,请注意利用索引的有序性.order by最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影响查询性能.
    反例:索引有范围查找,那么索引有序性无法利用,如:WHERE a>10 ORFER BY b;索引a_b无法排序.
  6. [推荐]利用覆盖索引来进行查询操作,来避免回表操作.
    正例:能够建立索引的种类:主键索引,唯一索引,普通索引,而覆盖索引是一种查询的一种效果,用explain的结果,extra列会出现:using index.
  7. [推荐]利用延迟关联或者子查询优化超多分页场景.
  8. []
原创粉丝点击