草庐IT

java - 独立于数据库的数据迁移

coder 2024-04-01 原文

我的目标是为现有应用程序启用架构和数据迁移。

这种问题似乎已经被问过很多次了,但是我认为这与我的要求和情况不同。

由于我对此领域没有经验,因此请允许我先规划一下应用程序的体系结构和假设。

建筑学

该应用程序是具有后端服务器的多用户企业 table 面应用程序,该服务器可以持久到任何主要数据库(MySql,Postgresql,SQL Server,Oracle DB等)。假定数据库是内部部署的,并由我们的客户维护。

使用的技术堆栈是相当常见的Hibernate + Spring + RMI/JMS-Combo。

当前,迁移是由服务器通过以下方式完成的:

  • 在服务器启动时,它会检查最新的预期模式版本
  • 如果大于当前版本,则开始迁移到下一个版本,直到current == latest:
  • 创建新数据库
  • 加载(全部)最新架构(带有很多CREATE TABLE ...的SQL脚本)
  • 迁移数据(在Java类中,使用2个JDBC连接到旧模式和新模式)
  • 加载(所有)最新约束(带有很多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脚本用于迁移。

    JOOQ:基于JDBC的Java中与数据库无关的Query-DSL。与Criteria API相当,但没有JPA的缺点。原则上应该允许数据库独立的数据迁移,但是不是可以帮助模式迁移

    诸如HQL,JPQL和Criteria API之类的JPA查询语言是不够的,因为
  • 无法引用实体管理器未映射的表。例如。联接表,元数据和审计表。
  • 需要保留所有版本的Entity类的副本才能进行映射。

  • 问题

    我意识到,就目前这个问题而言,它将被视为基于观点的问题。

    但是,我不一定要寻找针对此问题的特定解决方案(我怀疑是否存在针对此类复杂问题空间的明确解决方案),而是要验证我的假设。

    即是真的
  • Liquibase和Flyway主要关注架构迁移,而数据迁移留给读者练习吗?
  • 为了使Flyway支持多个不同的数据库,需要为每个数据库复制迁移脚本吗?
  • 总的来说,数据库独立数据迁移问题在企业Java中仍未解决?

  • 即使我将Liquibase/Flyway与JOOQ结合在一起,也看不到如何执行数据迁移,因为Liquibase/Flyway将数据库迁移到了位置。旧数据库被破坏,并有机会将旧数据转换为新架构。

    感谢您的关注!

    最佳答案

    让我们分解一下。您是对的,这主要是基于意见的,但这就是我在经验中注意到的。

    Liquibase and Flyway are mainly concerned with schema migration and data migration is left as an exercise for the reader?



    您可以使用liquibase和flyway进行数据迁移。这是我经常做的事情。以我想将User表拆分为User表和Address表的示例为例。我将编写一个迁移脚本(基本上只是一个sql文件)来创建新的地址表,并将所有相关数据复制到该表中。

    in order for Flyway to support multiple, different databases, one needs to duplicate the migrations scripts per database?



    可能将flyway和liquibase更好地视为数据库版本控制工具。如果我的应用程序需要数据库的版本10,那么这些工具将帮助我达到这一点。同样,迁移脚本只是基本的.sql文件。如果您使用的是某些mysql特定功能,则这些功能仅会在迁移脚本中使用,而在SQL Server上将无法使用

    by and large, the problem of database independent data migration remains unresolved in enterprise Java?



    嗯,我不确定这一点。我同意这是一个问题,但实际上这不是一个大问题。在过去的8年多的时间里,我只编写了ansi sql。它应该随处可移植。因此,从理论上讲,我们可以将这些应用程序提升到另一个数据库中。 JPA和各种实现有助于解决这些差异。假设某个项目的所有业务逻辑都包含在特定于实现的sql函数中,这取决于项目的构建方式,那么这将是一件令人头疼的事情。如果您将数据库用于CRUD,并且我认为这只是您要使用的数据库,那么这并不是什么大问题。

    因此,我认为您可能对飞行路线和液基有错误的认识。就像我之前说的那样,它们并不是真正的“迁移工具”,而是数据库版本控制工具。通过订购的特定sql迁移脚本的列表,我可以保证任何版本的数据库状态。我不确定这些工具是否可以用来将基于SQL Server的旧应用程序“迁移”到基于PostGres的应用程序中。

    关于java - 独立于数据库的数据迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46956753/

    有关java - 独立于数据库的数据迁移的更多相关文章

    1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

      如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

    2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    4. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

      有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

    6. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    7. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    9. ruby - 我如何添加二进制数据来遏制 POST - 2

      我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

    10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

      无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

    随机推荐