背景
之前做一个新项目 A 的时候,由于某些原因需要跟另外一个项目 B 共用数据库,刚开始开发的时候为了不影响项目 B 的开发和测试,我们拷贝了一个数据库进行开发。
问题
终于等到开发完想要部署测试的时候用回了原来的数据库,出现了一个尴尬的问题 ̄□ ̄||,因为两个项目都用activiti工作流,而且版本还不一致,新项目 A 用了6.0.0,旧项目 B 用的5.21.0,出现了版本冲突,导致旧项目 B 无法启动。
眼看上线deadline越来越近,得赶紧解决这个版本冲突的问题,于是就有了下文的探索过程。(这里插一句,使用第三方组件还是要了解清楚,出现版本冲突的问题,确实不应该 T ^ T)
尝试 1
尝试兼容版本,我们将旧项目 B 升级版本或者新项目 A 降低版本,发现都不行,因为这两个版本有一些功能、用法都是不一样的,无法兼容,而且也没有中间版本可以同时兼容。如果强行转换版本,就要修改代码,这样工作量太大,赶不及上线了o(╥﹏╥)o
尝试 2
代码都是人写的,既然无法兼容版本,那只能从源码入手,尝试跳过版本检验。我们通过查阅activiti工作流的相关资料,发现一些眉目,有一个参数配置 databaseSchemaUpdate 跟版本有关,databaseSchemaUpdate属性的取值:
- flase: 默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。
- true: 版本相等不做操作,数据库版本低进行更新操作,数据库版本高则抛出异常。如果表不存在,则自动创建。
- create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。
- drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。
- create:直接创建表
很遗憾,没有办法告诉我们如何跳过版本校验,我们不想进行版本匹配,更不想重建数据表。不过注意到 flase是进行版本匹配、true进行更新没有说到版本匹配。
尝试 2.1
先从true入手,那我们可以猜测如果都设为true,然后旧项目 B 先启动,新项目 A 后启动行不行?这样虽然表更新了,但是旧项目 B 已经启动了呀。试了下,确实是可以的,但是数据库版本号升高了,旧项目 B 再也启动不起来了。( ̄ェ ̄;)
再猜测,新项目 A 先启动,然后