Java 正确的版本控制策略

Java 正确的版本控制策略,java,mysql,database,version-control,Java,Mysql,Database,Version Control,我正在读这篇文章,我有一个关于这5篇文章的问题。 据我所知,您创建了一个包含所有SQL DDL语句的大型基线脚本。完成后,您可以在单独的脚本中跟踪每个更改 但是,我不明白脚本文件的名称如何与应用程序的特定构建相关联?他说,如果用户在3.1.5.6723中报告错误,您可以重新运行该版本的脚本。你会像他说的那样,在自己的文件中跟踪对表等的更改,还是在同一个脚本文件中有所有DLL更改,然后在自己的文件中有视图等 对表和视图的更改将不会保留在它们自己的文件中。您将为所做的每项更改创建一个新的更改脚本。所

我正在读这篇文章,我有一个关于这5篇文章的问题。 据我所知,您创建了一个包含所有SQL DDL语句的大型基线脚本。完成后,您可以在单独的脚本中跟踪每个更改


但是,我不明白脚本文件的名称如何与应用程序的特定构建相关联?他说,如果用户在3.1.5.6723中报告错误,您可以重新运行该版本的脚本。你会像他说的那样,在自己的文件中跟踪对表等的更改,还是在同一个脚本文件中有所有DLL更改,然后在自己的文件中有视图等

对表和视图的更改将不会保留在它们自己的文件中。您将为所做的每项更改创建一个新的更改脚本。所以,如果您将表“X”更改了5次,那么每个更改都将有5个不同的更改脚本

当您想要创建某个发布版本的模式时,您将获得该版本的源代码标签。从基线创建数据库。然后按时间顺序在该版本的代码中运行更改脚本。 e、 g

现在假设您希望从1.2版开始重新创建数据库:

  • 您可以将代码同步到标签版本_1.2
  • 按照baseline.sql、add\u publisher.sql、add\u publish\u date.sql的顺序运行脚本

  • 在数据库中保留一个版本号,并在启动时应用更新脚本,这是该策略的一个重要部分

    以下是startup的工作原理:

    • 检查数据库中的DB_版本记录
    • 查找更新>当前版本;也许是密码
    • 运行每个适用的“更新”、脚本或编程操作
    • DB_版本在每次更新之后都会更新,因此可以重新运行中途故障
    例如:

    • 查找DB_版本当前=789
    • 复杂的代码,或者一条长长的IF链,可以找到790及以上的更新
    • 更新#790,升级客户和账户表
    • 更新#791,升级邮件表
    • 更新#792,重组订单表
    • 数据库版本现在=792
    这里有一些警告。这相当有效;人们声称它应该100%可靠,但事实并非如此

    脚本不完整、字段长度变化或服务器版本差异的问题有时会导致脚本/SQL在某些数据库上传递,但在其他数据库上失败

    查找要运行的脚本,可以像一个包含许多IF语句的大型方法一样简单。或者,您可以通过发现或元数据更优雅地加载脚本。有时,能够包含编程代码(而不仅仅是SQL)非常有用

    public void runDatabaseUpgrades() {
        if (version < 790) {
          // upgrade Customer and Account tbls
          version = 790;
        }
        if (version < 791) {
          // upgrade Email tbl
          version = 791;
        }
    }
    
    public void runDatabaseUpgrades(){
    如果(版本<790){
    //升级客户和帐户TBL
    版本=790;
    }
    如果(版本<791){
    //升级电子邮件tbl
    版本=791;
    }
    }
    
    我个人使用。非常简单的工具。
    允许非常复杂的工作流,如

    而不是Liquibase,您可以使用Flyway(),它允许您编写自己的升级/降级SQL脚本。这提供了更大的灵活性,也适用于视图和存储过程


    Liquibase要求您使用他们自己的基于XML的语言进行模式更改,这可能有点限制。

    首先,DB升级是邪恶的,但这描述了一场噩梦

    可以根据升级方法创建程序员能力矩阵:

    • 0级:根本没有升级。客户非常害怕,他们会使用应用程序提供的UI或第三方DB管理解决方案手动移动数据(相信我,这确实是可能的)
    • 级别1:有一个脚本可以升级数据库转储。客户感到安全,但他们将在未来1-2年内解决一些微小且非常恼人的问题。系统正在工作,但不允许更改
    • 第二级:表格更改。巨大的停机时间,尤其是在升级过程中出现问题时。巨大的问题和几乎没有保证得到100%的安全结果。数据转换由错误脚本管理。顾客不高兴
    • 级别3:无模式设计:一次两小时的停机时间,让错误脚本在DB中转换配置(此步骤在许多情况下可能会损坏DB)。支援人员的咖啡储备已经用完了
    • 级别4:延迟透明升级:零停机时间,但仍有一些问题是可能的。顾客几乎都很高兴,但仍然记得以前的经历
    • 第5级:理想的体系结构,不需要显式升级。完全幸福。客户不知道升级过程是关于什么的。开发人员高效且冷静
    我将描述所有技术问题,但在此之前,请允许我陈述以下内容(请原谅我的回答太长):

    • 如今,开发周期非常紧凑,数据库规模很大
    • 实际上,任何功能都可能引入方案更改并破坏兼容性,因此,要么我们有一个简单而稳定的升级过程,要么我们可能会推迟某个功能
    • 客户可能会发现问题,因此有机会进行紧急热修复构建,并需要一些升级步骤
    • 一般来说,最好避免您和客户之间的任何障碍
    级别0和级别1 这两种情况都是明显和愚蠢的。任何人都应该避免这样

    第2级 改变对一个小桌子来说并不是件坏事,但对大桌子来说可能是个问题。在非常大的表(>1Gb)上,完成ALTERTABLE可能需要几个小时甚至几天。此外,它只解决了模式升级问题,但存储的数据呢?我还建议考虑物理数据布局,以了解这种方法背后的实际障碍。整个过程可能不安全,因此请确保有备份

    解决方案:

    • 复制和重命名:
    • 表拆分(应用程序)
      public void runDatabaseUpgrades() {
          if (version < 790) {
            // upgrade Customer and Account tbls
            version = 790;
          }
          if (version < 791) {
            // upgrade Email tbl
            version = 791;
          }
      }
      
      <?xml version="1.0"?>
      <upgrade>
      
         <version name="-7.4">
            <build name="*">
              <script class="upgrade.version7.Replace...Script"/>
              <script class="upgrade.version7.Update...Script"/>
               <!-- 5 scripts skipped -->
            </build>
         </version> 
         <version name="-7.6">
            <build name="*">
          <script class="core.DatabaseUpdateVersion" version="7.6.48"/>
            </build>
         </version>
         <version name="7.6">
            <build name="*">
              <script class="upgrade.version7.Update...Script"/>
          <script class="core.DatabaseUpdateVersion" version="8.0.40"/>
               <!-- 7 scripts skipped -->
            </build>
         </version>
      
         <version name="8.0">
            <build name="-53">... </build>
            <build name="+52">... </build>
         </version>
      
         <version name="8.1">
            <build name="-8"> ... </build>      
           <build name="-9">...</build>      
           <build name="-26">...</build>      
           <build name="-40">...</build>      
            <build name="-45">...</build>      
            <build name="-56">...</build>      
            <build name="-61">...</build>      
            <build name="-63">...</build>      
            <build name="-64">...</build>      
            <build name="-68">...</build>      
            <build name="-69">...</build>      
            <build name="-77">...</build>      
            <build name="-79">...</build>      
            <build name="-80">...</build>      
            <build name="-86">...</build>      
            <build name="-88">...</build>
            <build name="-89"> ... </build>
         </version> 
      
         <version name="8.2">...</version>
      </upgrade>