在更新Java EE应用程序时迁移数据库模式

时间:2012-04-15 11:49:28

标签: database java-ee glassfish dbmigrate

我有一个Java EE应用程序,它使用SQL Server Express作为后端数据库。 当我们有时部署新版本时,我们需要更改数据库:添加表,添加列,删除列,合并表,合并列等。

直到今天我们使用脱机SQL脚本来修改数据库,但是这个解决方案不可扩展且非常错误修剪。

我们开始使用具有@PostConstruct修饰方法的单例启动bean来添加和删除系统在部署期间使用的数据。

我们现在也想发布DML语句,以便我们可以在部署期间升级我们的数据库并一劳永逸地删除SQL脚本。

  1. 有没有人试图这样做,这是好方向吗?
  2. 我们应该使用entityManager.unwrap方法还是只是将JDBC DataSource资源注入我们的单例启动bean?

3 个答案:

答案 0 :(得分:6)

我们最近开始使用并对此非常满意。 documentation is very good。{{3}}。简而言之:您包含一组带有版本的SQL脚本。 Flyway引擎将获取尚未应用的SQL脚本(创建了一个特殊的元数据表)并运行它们。您可以将SQL与版本或纯Java一起使用。

答案 1 :(得分:6)

除了Tomasz的回答,您还可以使用LiquiBase。它提供的解决方案迫使开发人员“版本控制”他们的架构更改,因此当您最终进入生产阶段时,您就拥有了完全可理解的架构更改日志。然后,您可以使用LiquiBase将该更改日志或其任何子集应用于生产数据库。您还可以回滚更改日志的子集。

它可以开箱即用地处理各种更改,并且还可以使用自定义迁移java类。

我自己从未使用它,但它自2007年开源。

这是一个快速overview

答案 2 :(得分:3)

为了最终确定数据库迁移工具列表,我对solidbase非常满意。我们将它作为部署脚本的一部分启动,但是在单例bean中启动它的想法非常有趣。 Solidbase的wiki没有记录这样的嵌入式用法,但是通过快速浏览源代码类Runner就是您正在寻找的。