背景
我正在使用开源项目mongobee将数据库迁移添加到现有项目中。实际的迁移都由mongobee及其更改日志和变更集的概念处理。此增强功能的一部分涉及在运行时检查当前的MongoDB数据库迁移版本,并将其与java应用程序所需的版本进行比较。这背后的原因是我们希望安装我们的产品下载代码更新(新* .wars),并且在登录新版本的应用程序时,如果数据库版本的数据库版本将提示管理员用户更新数据库低于预期。
我们目前正在使用Maven打包和构建我们的软件。
问题
唠叨我的一个方面是如何处理标记Java源代码所期望的数据库版本。每次我们进行构建并添加迁移时,我都希望避免手动输入。
我提出的解决方案可能并不理想。我最初的想法是使用更改日志文件和类名称的约定,如“v0001_first_migration”,然后在构建时,使用maven AntRun插件调用单独编译的java文件,该文件遍历迁移更改日志目录并查找最新的迁移数字,然后存储导致资源文件,可能是XML。然后,应用程序可以在运行时读取该XML文件,以获得它期望的数据库版本。
1 - 这可行吗?
2 - 有没有办法在不使用AntRun的情况下在纯Maven中做这样的事情?
3 - 还有其他方法可以更容易地实现这一目标吗?
答案 0 :(得分:0)
作为我上面提出的解决方案的替代方案,我使用了一个反射项目:https://github.com/ronmamo/reflections并遍历我的迁移目录中遵循上述约定(v0001_first_migration,v0002_second_migration)的所有类名。我解析那些使用正则表达式获取整数并进行比较以确定应用程序所期望的迁移版本。数据库方面要容易得多,所以我不会过去。
现在,我不是使用Ant任务,而是将预期的应用程序迁移版本弹出一个单一的(我知道),或者只是调用找到预期的应用程序迁移的函数,具体取决于它的使用位置。
为什么选择单身人士?解析过程很昂贵,我希望在每个想要触及我们数据库的REST调用上使用这些数据。在REST层中,由于当前项目的一些限制,我创建了单例。这里更好的方法是在Tomcat的情况下,创建一个ServletListener并将迁移版本指定为ServletContext的一个属性。由于REST层的工作方式,我将修改一系列函数签名以传入@Context ServletContext。我们没有依赖注入容器,所以如果我不想触及REST层中的几乎所有操作,我的选项就会受到限制。 Singleton在启动时获得了预期的应用程序迁移版本,因此它仍然很容易使用模拟进行测试,并且没有我可以看到的并发问题。