04 升级程序及升级SQL规范

04 升级程序及升级SQL规范

升级程序及升级SQL规范

V5产品是一条主干上持续开发,我们的老版本客户也会选择升级到最新版本,所以开发任务过程中一定要考虑老客户升级,老客户升级有单独的升级程序

什么时候需要升级

  1. 涉及到在一张表里新增字段,并且字段有预制数据,则要考虑老版本升级上来数据预制问题。

  2. 涉及到废弃一个字段,改用另一个新字段的场景,需要将废弃字段的数据映射到新字段。

  3. 涉及到某个字段存储值数据结构调整,比如字段info老版本存储的XML,新版本存储JSON,则需要将XML转换为JSON。

升级操作类型

升级一般要求就两种实现方式:数据库SQL升级和编写升级程序(Java)。

第一种:数据库SQL升级

场景:新增了一个字段,需要对老版本数据做默认值赋值。那么可以这样来:

macro:code

-- 新增字段MySQL
ALTER TABLE DOC_LIBS ADD OFD_ENABLED SMALLINT;

-- 给是否开启ofd设置默认值
UPDATE doc_libs set  OFD_ENABLED = 0;

开发需要执行的动作:发起数据库变更申请,新增表字段,然后告知DBA预制历史数据。

安装程序SQL脚本分类

安装程序会有两类SQL脚本,一类是老版本升级到新版本的脚本,另一类是ALL-IN-ONE一个完整库的全部脚本。

安装程序完整SQL脚本存放目录:http://10.3.4.218:6666/svn/v5/ctp-ci/trunk/DDL/DDL_ALL_IN_ONE/PRODUCT

安装程序升级SQL脚本存放目录:http://10.3.4.218:6666/svn/v5/ctp-ci/trunk/DDL/PRODUCT_UPGRADE_SQL

老版本升级到新版本客户

先按照目录结构在,每个版本都有一个升级脚本,比如V8.0SP1下一版本是V8.0SP2,则会有80sp1to80sp2这个目录

这里面的SQL只有当前那个版本升级的SQL:

问题:如果我是V7.1升级到V8.0SP2会怎么执行呢?安装程序会依次执行71to71sp1、71sp1to80、80to80sp1、80sp1to80sp2四个文件夹的SQL。

全新安装客户

全新安装客户则是空数据库执行一次ALL-IN-ONE.SQL即可

第二种:升级程序

场景:1)我需要将原有的XML格式数据转换为JSON;2)我需要先select结果,然后再对结果解析update或delete数据

以上这种需要多条SQL结合操作的,都要把代码放在升级程序里执行。

升级程序工程(自2021年9月15日起)已经迁移到Gitlab:http://gitlab.seeyon.com/V5-group/install/ctp_upgrade  没有权限就调用《svn-git权限管理单》申请,开放目前只有只读权限。

升级程序代码默认只有只读权限,开发写完升级程序、自测通过后,需要发起Merge Request提交。

升级程序编写结构

1)Java代码存放:com.seeyon.ctp.upgrade.xxtoxxx下面,这个xxtoxx就是升级版本,一般当前在什么版本号就把代码写在那个版本中,比如当前是V8.0SP2,上一个版本是V8.0SP1,则代码写在u80sp1to80sp2里面

2)新建一个Java类,extends继承当前升级版本抽象类,实现runUpgrade方法

3)升级程序主要是基于JDBCAgent写SQL来实现对应逻辑,注意需要兼容MySQL、SQLServer、Oracle、Postgresql、达梦、人大金仓、神州通用等数据库,不兼容则要写if...else去区分。

JDBCAgent jdbc = new JDBCAgent();
try{
  jdbc.xxx
}catch(Exception e){
  log.error("",e);
}finally{
 //注意一定要关闭连接
  jdbc.close();
}

具体的编写代码参考历史升级程序即可。

4)在/ctp-upgrade/cfgHome/spring/xxtoxx中定义spring文件,文件名参考历史配置。特别注意spring配置内容:

一定要注意bean id一定不要跟历史的所有升级程序spring冲突,所以最好像下面不应该定义id=edocElementUpgrade,而应该是edocElementUpgradeU80sp1to80sp2,后面这个主要是避免重复

<beans default-autowire="byName">
 <bean id="edocElementUpgradeU80sp1to80sp2" class="com.seeyon.ctp.upgrade.u80sp1to80sp2.edoc.EdocElementUpgrade"></bean>
</beans>

升级程序运行调试

通过配置参数连上数据库,即可对当前数据库进行升级。

1)修改数据库连接信息:/ctp-upgrade/cfgHome/conf.properties

datasource用于配置数据源,各种数据库自己根据情况配置,upgrade.version.list一般不用自己管,这个表示升级路线,每个小版本的升级信息都在这里面。

datasource.url=jdbc:mysql://localhost:3306/v51sp1a61_binhai
datasource.driverClassName=com.mysql.jdbc.Driver
datasource.username=root
datasource.password=root

upgrade.version.list=350to50,50sp1to50sp2,50sp2to51,51to51sp1,51sp1to56,56to56sp1,56sp1to60,60to60sp1,60sp1to61,61to61sp1,61sp1to20170930,61sp1to20171030,61sp2to70,70to70sp1,70sp1to70sp2,70sp2to20181130,70sp2to71,71to71sp1,71sp1to80,80to80sp1,80sp1to80sp2

2)保证本地工程对应数据库驱动jar加载到class下

3)执行一下如下文件:/ctp-upgrade/src/Test.java即可执行升级。注意这个文件的注释,根据提示去做对应配置即可。

第三种:V5程序内编写升级(不推荐、不推荐、不推荐)

简单说就是OA启动之后,在OA后台执行升级动作。除非是经常要执行的程序,否则请不要把一次升级的代码放在V5程序内运行。因为有的升级动作明明只需要执行一次,你却要每次重启之后都检测一次,这种是不合规的。一次执行的代码都放在第二种升级程序中。

LICENSED UNDER CC BY-NC-SA 4.0