Java 在已部署的web应用程序中更改数据库的最佳做法

Java 在已部署的web应用程序中更改数据库的最佳做法,java,database,design-patterns,jakarta-ee,tomcat,Java,Database,Design Patterns,Jakarta Ee,Tomcat,我正试图找到一种标准方法来解决我遇到的以下问题。 我在容器(特别是Tomcat)中部署了一个web应用程序,它使用一个数据库来实现其功能(在我的例子中,它是一个文件模式的SQL数据库,因此没有后端SQL server) 我感兴趣的是,随着数据库架构的更改(新表/新列、删除列等),在web应用程序的较新版本上处理数据库各种更改的最佳方法是什么。 例如,我如何处理某人升级到我的web应用程序的较新版本,并且仍然以最佳方式(自动?无seemle?少手动?)保留旧数据库中的旧数据的情况 我认为这种情况并

我正试图找到一种标准方法来解决我遇到的以下问题。
我在容器(特别是Tomcat)中部署了一个web应用程序,它使用一个数据库来实现其功能(在我的例子中,它是一个文件模式的SQL数据库,因此没有后端SQL server)

我感兴趣的是,随着数据库架构的更改(新表/新列、删除列等),在web应用程序的较新版本上处理数据库各种更改的最佳方法是什么。
例如,我如何处理某人升级到我的web应用程序的较新版本,并且仍然以最佳方式(自动?无seemle?少手动?)保留旧数据库中的旧数据的情况

我认为这种情况并不罕见,因此我相信这里有一些最佳实践可以遵循。
有人能帮我吗?

最近我们发现,它工作得很好,支持数据库模式更改的版本控制(纯SQL脚本)


显然,这个话题要广泛得多。例如,当应用程序的旧版本和新版本在更新的模式中完美运行时,您需要格外小心。此外,你应该考虑回滚策略(当升级不好或者你想降低你的应用程序)-有时它就像删除添加的对象(表,列)一样简单,但是当你的脚本移除某个东西时,回滚应该恢复它们。您希望尽可能降低对数据库的更改,尤其是对现有列的更改

其次,如果需要重命名列或更改某些约束(注意不要变得更严格,因为可能有一些数据不匹配),请使用
altertable
语句。这样,列中的数据将被保留,除非您删除列。:)

此外,为具有约束(如NOTNULL)的新列提供默认值,因为该表中可能已经存在需要更新的数据集,以便不违反这些约束。(或者添加列,运行一些代码填充列,然后添加约束。)

第三,由于应用程序似乎有多个用户,并且他们可能有不同的版本,因此提供更新的最简单方法是提供到下一个更高版本的顺序更新。因此,如果有人想从版本2更新到版本5,您首先要执行2->3更新,然后执行3->4更新,最后执行4->5更新


这可能需要更长的时间来运行,但应该会降低复杂性,因为您不必担心所有可能的组合(例如2->4、2->5、3->5等)

这取决于数据库的更新方式。你是在删除/重新创建表还是在使用alter table语句?@Thomas:现在我根本没有更新的计划。这就是为什么我要问这个问题。怎么做it@Thomas:我的意思是,我不知道应该如何更新它,但升级过程应该如何处理这个问题?例如,如果我的应用程序是通过RPM交付的,而我的数据库是一个文件对象SQL数据库脚本应该如何/何时运行?我无法获得总体结果design@Jim我所知道的应用程序有一个单独的更新过程,您通常手动启用它,运行后它会自动禁用。如果您有RPM发行版,应用程序可能会在默认情况下启用更新,并且在启动或第一次运行期间,如果启用,则更新过程将由应用程序运行。更新成功后,将设置一个标志以在后续启动期间禁用更新(除非在此期间再次发生RPM更新)。