我的目标是为现有应用程序启用架构和数据迁移。
这种问题似乎已被多次提出,但我认为有不同的要求和情况,我认为。
由于我在这个领域缺乏经验,请允许我首先列出应用程序的架构和我的假设。
该应用程序是一个多用户企业桌面应用程序,具有后端服务器,可以持久保存到任何主要数据库(MySql,Postgresql,SQL Server,Oracle DB等)。假设数据库是内部部署并由我们的客户维护。
使用的技术堆栈是一个相当常见的Hibernate + Spring + RMI / JMS-Combo。
目前,服务器通过以下方式完成迁移:
CREATE TABLE ...
的SQL脚本)ALTER TABLE ...
的SQL脚本)此迁移速度缓慢且仅向前。但这很简单。问题是,到目前为止,模式脚本和数据迁移中的查询一直在使用MySQL语法和功能。
请注意,通过迁移数据,我的意思是:后端服务器将数据从旧架构复制到新架构,并在必要时对其进行转换。 此外,迁移过程在我们的客户端内部自动启动。意思是,我们只能控制JDBC连接,但不能直接访问数据库,也不了解正在使用的特定数据库(MySQL,SQL Server,...)。
目标是用独立于数据库的方案替换或扩充此迁移方案。
StackOverflow 1 2 3 4 5 6 7:回答州使用Hibernate的内置功能。但是,文档声明这不是production ready。此外,AFAICT,所有答案都只关注架构迁移。
Liquibase:使用自定义DSL(在XML / JSON / YAML / etc中)以允许仅与数据库无关的架构迁移。
DBUnit:使用自定义XML-DSL捕获数据库状态的快照。 无法重新创建架构版本1到版本2的快照。
flyway:原则上与Liquibase相同。但与数据库无关,因为SQL-Scripts用于迁移。
JOOQ:基于JDBC的Java中独立于数据库的Query-DSL。可与Criteria API相媲美,但没有JPA的缺点。原则上应该允许数据库无关的数据迁移,不帮助架构迁移。
JPA-Query语言(如HQL,JPQL,Criteria API)还不够,因为
我意识到,现在这个问题已经存在,它将被视为基于意见的问题。
但是,我不一定在寻找这个问题的具体解决方案(我怀疑这个复杂的问题空间是否存在明确的解决方案),而是验证我的假设。
是的,是吗,
即使我将Liquibase / Flyway与JOOQ结合使用,我也看不到如何执行数据迁移,因为Liquibase / Flyway将数据库迁移到位。旧数据库被破坏,并有机会将旧数据转换为新模式。
感谢您的关注!
答案 0 :(得分:3)
让我们分解一下。你是对的,这主要是基于意见的,但这是我在经历中注意到的。
Liquibase和Flyway主要关注架构迁移,数据迁移是留给读者的练习吗?
您可以使用liquibase和flyway进行数据迁移。这是我经常做的事情。以我想要将User表拆分为User和Address表的示例为例。我编写了一个迁移脚本,它基本上只是一个sql文件,用于创建新的Address表并将所有相关数据复制到其中。
为了让Flyway支持多个不同的数据库,需要为每个数据库复制迁移脚本吗?
可能,flyway和liquibase更好地被认为是数据库版本控制工具。如果我的应用程序需要数据库的第10版,这些工具将帮助我达到这一点。同样,迁移脚本只是基本的.sql文件。如果您正在使用某些特定于mysql的函数,那么这些函数只会进入迁移脚本,并且它们无法在SQL Server上运行
呃,我不确定这个。我同意这是一个问题,但在实践中它并不是一个大问题。在过去8年多的时间里,我只写了ansi sql。它应该随处携带。因此从理论上讲,我们可以将这些应用程序提升到不同的数据库。 JPA和各种实现有助于解决这些差异。根据项目的构建方式,假设一个应用程序在实现特定的sql函数中具有所有业务逻辑,那么它将成为一个令人头痛的问题。如果你正在使用数据库进行CRUD,并且我认为你应该使用它的全部内容,那么这并不是什么大不了的事。总的来说,数据库无关的数据迁移问题在企业Java中仍未解决?
所有这一切,我想你可能对flyway和liquibase有错误的想法。就像我之前说过的那样,他们并不是真正的移植工具。它们是数据库版本控制工具。通过订购的特定sql迁移脚本列表,我可以保证任何版本的数据库状态。我不确定这些是我用来“迁移”的工具。基于SQL Server的遗留应用程序到基于PostGres的应用程序中。