基于SpringBoot的数据库自动升级方案设计与实现

(整期优先)网络出版时间:2023-12-09
/ 2

基于SpringBoot的数据库自动升级方案设计与实现

邹叶 王雄

贵州航天计量测试技术研究所  贵州 贵阳  550009

摘要随着各类开源框架的兴起,应用软件的开发效率极大提高,升级频率大大加快,但是数据库表结构的升级问题,一直没有得到很好的解决。当下使用纯手工方式升级,过程繁杂耗时且极易导致遗漏和出错。本文围绕软件升级过程的去手工化改造,提出并实现了一种自动升级MySQL数据库表结构的方案。此外,通过在真实环境中使用该模块,验证了所提方案的有效性。

关键词SpringBoot数据库表结构;自动升级软件升级MySQL;去手工化

1.引言

数据库的稳定性直接影响着应用软件的质量。目前,应用软件升级过程中,对如何处理数据库表结构升级的问题,一直没有很好的解决方案,很多高风险操作,比如在生产环境手工修改数据库表结构、手动执行SQL脚本等屡见不鲜。本文以数据库升级的去手工化为切入点,依托目前最流行的SpringBoot框架,开展SQL脚本质量控制和表结构自动升级的研究,最终形成可应用于生产环境的解决方案。

本文的研究内容包括:(1)SpringBoot框架的关键特性分析(第2节);(2)数据库SQL脚本规范(第3节);(3)数据库SQL脚本执行过程分析和数据库自动升级组件htcs-platform-dbupgrade-starter的设计与开发(第4节);(4)通过检查目标数据库,验证htcs-platform-dbupgrade-starter组件的有效性(第5节)。

2.SpringBoot框架的关键特性

SpringBoot是近几年最流行的Java WEB 后端应用开发框架之一,其约定大于配置的开发哲学,容器化的编程思想,依赖注入、插件化等技术特性,将开发人员从繁杂的技术细节中解放出来,从而将更多的精力投入到业务实现上。

本文利用SpringBoot的自动配置功能,将数据库自动升级模块打包为starter,极大降低用户的使用成本。自动配置的关键步骤如下:

(1)开启bean发现

在启动类上添加@EnableAutoConfiguration注解,SpringBoot就会自动查找所有的jar包,读取META-INF/spring.factories文件,加载该文件中指定的bean。

(2)加载用户配置

@ConfigurationProperties注解用来指定要从应用的配置文件中获取哪些配置项。

(3)条件配置

META-INF/spring.factories中指定的bean添加@ConditionalOnProperty注解,以便根据用户配置决定是否启动该模块。

(4)延后配置

数据库升级执行SQL脚本前,需要连接到数据库(数据源),本方案复用了spring默认的数据源,所以该模块初始化应该在数据源初始化完成之后,添加@AutoConfigureAfter({ DataSourceAutoConfiguration.class})注解即可。

(5)启动升级服务

主升级服务类实现InitializingBean接口,在afterPropertiesSet()方法中启动执行SQL脚本逻辑。

3.SQL脚本规范

在正式的生产环境上,数据库表结构的升级是通过执行SQL脚本来实现的,但是很多后端开发人员没有编写SQL脚本的习惯,或者虽然编写了SQL脚本,但是质量不高。完全通过测试人员发现数据库问题是一个高投入、低产出的脏活。想要缩短软件开发周期、提高软件质量,必须从源头确保代码质量可靠,SQL脚本也是软件代码不可或缺的一部分。

SQL脚本质量可靠性主要从以下几方面管控:

(1)所有数据库变更必须编写SQL脚本,负责人review通过后才能纳入版本库;

(2)规范SQL脚本的文件组织格式和命名规范;

(3)执行SQL脚本前自动检查SQL语法,存在语法错误则应用无法启动。

其中(1)属于团队管理的范畴,(3)为软件实现细节,此处不做过多讨论。这里着重讨论(2)SQL脚本规范,包括脚本文件命名、脚本文件目录组织格式和脚本内容编写规范。

3.1.目录规范

SQL脚本在Java项目中放置于resources目录下,其层级格式按照“dbUpgradeScript /模块/版本/SQL脚本文件”的格式组织,各目录层级说明如下:

dbUpgradeScript,用于放置所有数据库脚本;

模块,由执行顺序和模块名称组成。执行顺序为三位整数。

版本,SQL脚本的版本。

脚本文件,软件升级时要执行的SQL脚本。

3.2.命名规范

SQL文件的命名由6个部分组成,如下图 3所示:

图 3 SQL脚本命名规则

命名中的各组成部分说明如下:

1、执行顺序:5位数的SQL执行顺序编号;

2、作者:该脚本的编写人,全拼音;

3、操作类型:ddl、dml;

4、操作名称:create、alter、drop、insert、update、delete;

5、操作对象:table、view、trigger、event、function、procedure;

6、对象名称:具体的表、视图、函数、触发器等的名称。

3.3.内容规范

除了要满足SQL语法以外,为了便于排查SQL执行过程中的异常,本方案还做了如下脚本书写限制:

(1)正确的SQL语句必须以“;”结尾。

(2)一个文件只做一件事。哪怕是对同一个表进行操作,如果操作类型不同,也应该编写两个SQL文件。

(3)不允许在一个SQL文件中做多个互不相干的操作。比如在一个文件中写两个SQL语句,分别执行创建表、插入数据操作。

4.组件设计与开发

本方案开发的组件主要包含三部分的内容:配置文件、自身使用的记录表和逻辑代码。设计要点如下:

添加配置,用于控制是否启用此功能。

以starter插件的方式引入,低入侵性。

该模块也有自己的表,用于保存升级记录。

语法检查,词法分析判断SQL是否合法。

确保该模块在其他bean之前被加载。

根据配置判断是否启用数据库升级功能。

保密性支持:如果系统使用的数据库连接用户没有修改数据库结构的权限,则在配置文件中指定用户名密码的方式不能满足保密性要求,此时通过使用命令行参数解决,在应用启动时输入用户名/密码。

5.组件有效性验证

5.1.引入模块

此模块按照springboot starter规则编写,使用极其简单,只需如下三步即可启用数据库自动升级功能:引入依赖、添加配置、添加SQL脚本。

在Maven项目的pom.xml文件中引入模块依赖:

 

        com.htcs

        htcs-platform-dbupgrade-starter

        ${dbupgrade.version}

   

在项目的配置文件中添加数据库升级相关配置:

  # 数据库自动升级相关配置

  dbupgrade:

    # 是否开启数据库自动升级,不指定或设置为 false 则表示关闭

    enable: true

如果数据源配置(spring.datasource)中指定的用户拥有修改表结构的权限,则用户名密码可不用配置。

5.2.功能验证

功能验证主要包括如下几个方面:

(1)项目自身及其他依赖包中的脚本是否被执行

(2)脚本执行错误时应用是否无法启动

(3)应用启动成功时更新记录是否正确

(4)应用启动成功时目标数据库是否被正确修改

经验证,以上4项均符合预期。

6.结束语

本文提出了一种应用软件数据库表结构自动升级方案,根据所提方案开发实现了htcs-platform-dbupgrade-starter模块,并通过在实际项目中使用,验证了该模块的有效性。同时,该starter模块已经在本单位内部多个项目中投入使用,提高开发效率的同时,软件质量得到有效管控,为本单位产业数字化、数字产业化提供有力保障。

未来的工作中,我们会在此基础上进行深入研究,一是陆续收集开发过程中出现的语法问题,加入到语法检查中;二是适配更多数据库,目前仅在MySQL上验证通过,后续根据需要可适配国产数据库;三是逐步完善对回滚的支持,当应用升级失败时,数据库已经执行的变更可以被回滚。四是支持在线升级。

作者简介:姓名:邹叶(1992.03--);性别:男,民族:汉,籍贯:贵州省贵阳市,学历:本科;现有职称:工程师;研究方向:计算机软件与理论。