我正在构建一个使用hibernate和mysql以及tomcat的web应用程序。随着产品的发展,我不断被要求提供新功能,这通常意味着需要更改数据模型。
我现在正在做的是将数据库的所有关键数据导出到平面文件。关闭数据库和服务器,重新配置数据库以匹配新的hibernate映射和mysql表和列,以编程方式导入保存的数据以适应新的数据模型,然后重新启动服务器。
还推荐了什么?
答案 0 :(得分:0)
没有其他建议。如果这种做法对你有用,那很好。您还可以使用alter语句来使数据库模式发展。如果由于大量数据导致无法再导出平面文件或从平面文件导入,则使用临时表来迁移数据等。但在某些时候,数据必须以某种方式迁移。
答案 1 :(得分:0)
您可以使用dbdeploy或类似的增量数据库工具,只允许在升级之前添加增量。
他们会为您跟踪数据库的版本,并在开发过程中为每个模型更改添加新的Delta。升级生产服务器时,对其运行dbdeploy并确定数据库所处的状态,然后仅应用必要的升级。
这意味着您永远不必导出和重新导入数据 - 您只需将更新应用于现有数据模型 - 这将大大加快您的部署时间,但仍会有一点中断。
建议您在升级之前转储数据库 - 因为如果事情变坏,您可以快速回滚。
修改强>
我发现这个link关于EngineYard如何使用迁移实现零停机 - 他们使用Ruby但是这种方法类似于我在这里概述的方法。
答案 2 :(得分:0)
如果您对零停机时间部署感兴趣,那么有很多方法可以解决这个问题。我发现this博客文章概述了实现这一目标的不同策略。
基本要点是您在单独的时间对主应用程序进行数据库升级,并确保数据库具有可为空的列,并且代码可以调整为使列神秘地显示或消失。
作者为不同的技术提供了一些策略 - 但后来承认用hibernate做这个有点繁琐:
Hibernate - 在使其表现时可能会有点麻烦, 特别是如果删除列。你通常最终会创造共同点 持久化类的接口,具有多个版本的 实施课程。您可以决定要连接哪些类 在初始化之前使用模式或结果集元数据进行休眠 SessionFactory。其他持久性存在更糟糕的问题 Java中的技术,特别是喜欢的许多JPA风格 在启动时检测类的字节码。
这是一篇非常有趣的文章,我推荐阅读所有文章。
(Facebook和雅虎不使用Hibernate!)
从用户的角度来看,为了实现零停机时间,它通常涉及使用受负载均衡器保护的应用程序集群 - 因此您可以将每个应用程序从策略中删除并升级,而无需用户尝试访问它重新启动。你必须考虑会话粘性,数据源一致性和各种其他东西 - 但主要的是它不是魔术。