升级程序及升级SQL规范
V5产品是一条主干上持续开发,我们的老版本客户也会选择升级到最新版本,所以开发任务过程中一定要考虑老客户升级,老客户升级有单独的升级程序。
什么时候需要升级
涉及到在一张表里新增字段,并且字段有预制数据,则要考虑老版本升级上来数据预制问题。
涉及到废弃一个字段,改用另一个新字段的场景,需要将废弃字段的数据映射到新字段。
涉及到某个字段存储值数据结构调整,比如字段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,80sp1to80sp22)保证本地工程对应数据库驱动jar加载到class下
3)执行一下如下文件:/ctp-upgrade/src/Test.java即可执行升级。注意这个文件的注释,根据提示去做对应配置即可。
第三种:V5程序内编写升级(不推荐、不推荐、不推荐)
简单说就是OA启动之后,在OA后台执行升级动作。除非是经常要执行的程序,否则请不要把一次升级的代码放在V5程序内运行。因为有的升级动作明明只需要执行一次,你却要每次重启之后都检测一次,这种是不合规的。一次执行的代码都放在第二种升级程序中。