ORM规约变更经典案例---mysql军规

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
简介:   先介绍一下《MySQL数据库开发的三十六条军规》,这里只介绍核心的,具体内容大家可以自行百度,这是从底层开发人员到管理者必须知道规范。出自58赶集。写在前面的话:  总是在灾难发生后,才想起容灾的主要性;  总是在吃过亏后,才记得有人提醒过。

先介绍一下《MySQL数据库开发的三十六条军规》,这里只介绍核心的,具体内容大家可以自行百度,这是从底层开发人员到管理者必须知道规范。出自58赶集。

写在前面的话:

 总是在灾难发生后,才想起容灾的主要性;

 总是在吃过亏后,才记得有人提醒过。


核心军规:

     不在数据库做计算,CPU计算务必移至业务层;

     控制单表数据量,单表记录控制在千万级;

     控制列数量,字段数控制在20以内;

     平衡范式与冗余,为提高效率可以牺牲范式设计,冗余数据;

     拒绝3B(big),大SQL、大数据、大批量

  介绍两个例子。这个适合用STAR法则。STAR法则是情境(situation)、任务(task)、行动(action)、结论(result)四项的缩写。STAR法则是一种常常被面试官使用的工具。一般常说的开放性的问题,就是设立一个场景怎样解决问题基本用的是这种工具。

 

案例1:


以下是我们组发生的一个真实例子,具体操作和调研是由我两个同事实施的。


情境:


  核心交易目前在进行代码重构,数据模型的重构是其中重要的一个环节。一天我们同事在进行DDL(Data Defination Lauguage)的变更,由于两个字段比较相近,但是其中一个是原有字段不可为空,另外一个是新增字段,允许为空,结果空字段被赋值给了非空字段,DDL执行导致大量异常。DDL变更回滚后日志恢复正常。


任务:


  从java程序到连接mysql数据库用到了atlas、mybatis、数据库驱动到达mysql数据。而字段的映射是mybatis这样的ORM(Object Ralational Mapping)框架来处理的,我们的任务就是分析mybatis的源码和配置,找到问题的根源和以后要注意的事项。

 

行动:


  下载mybatis源码进行调试、分析。当前生产环境中,Mybatis版本是3.2.8.


  在使用mybatis时,有时可以不定义resultMap,直接在<select>语句上指定resultType。此时涉及到Mybatis的结果集自动映射。Mybatis的自动映射。Mybatis的自动映射默认开启。分析源码理解mybatis结果自动映射原理:


  1. mybatis自动映射预处理流程:


1112728-20180219194440616-1159301287.png



 2.自动映射流程(applyAutomaticMappings方法)


1112728-20180219195108894-783525886.png



 就是说applyAutomaticMappings要用到两个配置参数:mapUnderscoreToCamelCase和callSettersOnNulls。


  mapUnderscoreToCamelCase:是否开启驼峰命名。开启后会对大小写、下划线均不敏感。


     callSettersOnNulls:是否在该字段值为null时将结果同时反射set赋值方法进行赋值。


  3. 自动驼峰命名规则测试实验


实体属性 字段名 是否自动驼峰命名 是否可以赋值
deviceId device_id true 赋值给deviceId
deviceId device_id false 没有赋值给deviceId

traceno

traceNo

traceno true 赋值给traceNo

traceno

traceNo

trace_no false 都没有进行赋值

traceno

traceNo

trace_no true 赋值给traceNo

 

 

结论:


  在映射时会先把没有在resultMap中定义字段映射的字段按照名称相同的方式自动映射到返回类型的对应属性上。自动映射会忽略下划线和大小写。


  Mybatis settings配置项说明应该仔细研读。


  字段定义各个字段之间的区分要尽可能的大,严禁使用只有大小写和下划线不同的两个字段。

 

  我们现在在做分享会和读书会,我的想法是这些学习活动要尽量贴近项目,做有深度的学习。代码是随便找个人培训一下就可以写的,但是写出代码的效率和可维护性等代码质量的要求决定了大公司对初级程序员要求的门槛。而对所有技术研究的深度决定了突发问题的解决能力,对后续的建设提出的指导和建议。

 

案例2:


  《逆流而上》里介绍的一个案例。


情境:


  在某次项目发布阶段(数据库使用了分库分表),因为业务需要新增表字段,从SQL的代码逻辑来看,使用了select *,新增字段应该是兼容的,但在做线上数据库DDL操作后,立即出现了日志错误数飙升报警。当回滚还未执行,日志错误就已经自动恢复。


任务:


  从问题的现象来看,这个问题只有在变更过程中才出现,不太像是结果集映射问题,如果是映射问题,不执行回滚时无法自动恢复的。DBA反馈,可能是TDDL(Taobao Dustributed Data Layer分布式数据访问引擎)层对Select * 的解析逻辑引起DDL变更的不兼容。我们的任务就是确认问题发生的真正原因和对以后的指导意义。


行动(分析过程):


  1. TDDL在执行的时候,碰到select *,会从数据库表中解决出对应的全部字段:取第一个库的第一个表进行解析,解析之后,会缓存结果。替换*,然后在吧解析后的SQL语句交到目标数据库执行。


  2. 在第一个库变更后,TDDL拿到最新的字段列表,后续一段时间内的查询,都直接用带有新增字段的SQL语句提交到数据库执行;由于有部分数据库还没执行变更,没有新的字段,导致数据库执行出错,无法查询数据。


结论:


  对于此问题是分库分表中,持久层框架无对select *的兼容逻辑导致。


  但是使用select *的弊端不限于此,比如select * 查询非必需字段,会造成资源浪费甚至影响服务器性能;增加SQL的解析成本;表结构变更可能会引起字段映射问题;不会使用覆盖索引,不利于查询的性能优化等。


  《阿里巴巴编程规约》中对于ORM规范,有明确一条强制规约:在表查询中,一律不要使用*作为查询的字段列表,需要哪些字段必须明确写明。


  很多人问过我学习方法的问题,我觉得把这些基本规约和军规仔细研读,在平时的工作中多总结实践,也可以算作一个初级或者中级程序员的亮点了。技术追求体现在解决不了的问题追究到底,了解不了的问题研究到底。项目中问题不是天天有,但是这些理论怎样和实际结合确是天天要面对的问题。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
9月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
226 3
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
1249 0
案例剖析:MySQL唯一索引并发插入导致死锁!
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
281 2
|
SQL 关系型数据库 MySQL
案例剖析,MySQL共享锁引发的死锁问题!
案例剖析,MySQL共享锁引发的死锁问题!
292 0
|
消息中间件 关系型数据库 MySQL
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
981 0
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
存储 SQL 关系型数据库
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
377 25
|
数据管理 关系型数据库 MySQL
数据管理服务DMS支持MySQL数据库的无锁结构变更
本文介绍了使用Sysbench准备2000万数据并进行全表字段更新的操作。通过DMS的无锁变更功能,可在不锁定表的情况下完成结构修改,避免了传统方法中可能产生的锁等待问题。具体步骤包括:准备数据、提交审批、执行变更及检查表结构,确保变更过程高效且不影响业务运行。
2294 2
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。

推荐镜像

更多