程序跨版本自动升级,自动同步数据库的两种方案
一个程序或多或少会涉及到数据库,跨版本自动升级时如果只是文件则覆盖即可,数据库则不那么容易,曾被这问题困扰,现在说一下思路。
首先,指定一个文件夹作为更新数据库的sql。
每次更新数据库进行修改后,把需要执行的sql保存到一个新的sql文件里。
sql文件提交的注意事项
客户端拉取到更新的sql文件,要执行sql文件里的内容,因为不可重复执行,也不知道客户端什么时候拉取什么时候执行。
如果sql里的脚本发生变更,则无法分割提取出变更后的sql,也就意味着不知道要执行的sql是什么。
如果每次提交都是新sql文件,提交就不可修改其内容,这能保证不出错误。
多种拉取执行的方法
程序的更新,可以有多种方式,下面简单的介绍3种
基于 zip 的更新。
这是最简单的一种更新,全量更新,适合体积较小的程序,解压zip,文件全部覆盖。【先解压到临时目录,再全部覆盖】
根据前面指定的sql文件夹,检测zip解压出来的文件,逐个对比是否新增了sql文件,如果存在新文件,则立刻执行,或不执行【3】
基于 GIT 等版本管理器
可以使用 GIT 或 SVN 进行代码同步,这时,依然是同理的。
根据 GIT 的新增文件钩子进行脚本编码,检测如果新增的文件,刚好是指定sql文件夹下的sql,则立刻执行,或不执行【3】
基于 Saas 的单文件更新
原理和前面差不多,也就是自己部署一个服务器,这是一个定制的服务器。
这时,服务器上始终有最新的程序文件。客户端点击更新, 逐个遍历所有文件,找出所有新增、修改文件【执行校验文件的哈希值判断文件是否相同】,再拉取新文件,如果拉取到指定sql文件夹下的sql,则立刻执行,或不执行【3】
执行更新sql的两种方案
这里解释前面标记的 【3】
自动执行方案:这里是指不需要手动点击执行,只要拉取到了符合的sql文件,则立刻执行执行。
手动执行方案:拉取到新文件时,不会自动执行,人工校验内容后,手动点击执行。
说一下两者的优缺点
自动执行正常来说更方便,但也更依赖于服务器端的正确推送,如果推送异常则客户端炸裂。
如果手动执行,则在修改系统核心表时,因为更新时没有自动执行,整个程序直接瘫痪【这也意味着必须开发独立于系统的组件,专门做sql的更新】。
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-197.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。