不断变化(hibernate)的数据模型,如何避免服务器关机

时间:2012-07-15 04:36:27

标签: sql hibernate tomcat

我正在构建一个使用hibernate和mysql以及tomcat的web应用程序。随着产品的发展,我不断被要求提供新功能,这通常意味着需要更改数据模型。

我现在正在做的是将数据库的所有关键数据导出到平面文件。关闭数据库和服务器,重新配置数据库以匹配新的hibernate映射和mysql表和列,以编程方式导入保存的数据以适应新的数据模型,然后重新启动服务器。

还推荐了什么?

3 个答案:

答案 0 :(得分:0)

没有其他建议。如果这种做法对你有用,那很好。您还可以使用alter语句来使数据库模式发展。如果由于大量数据导致无法再导出平面文件或从平面文件导入,则使用临时表来迁移数据等。但在某些时候,数据必须以某种方式迁移。

答案 1 :(得分:0)

您可以使用dbdeploy或类似的增量数据库工具,只允许在升级之前添加增量。

他们会为您跟踪数据库的版本,并在开发过程中为每个模型更改添加新的Delta。升级生产服务器时,对其运行dbdeploy并确定数据库所处的状态,然后仅应用必要的升级。

这意味着您永远不必导出和重新导入数据 - 您只需将更新应用于现有数据模型 - 这将大大加快您的部署时间,但仍会有一点中断。

建议您在升级之前转储数据库 - 因为如果事情变坏,您可以快速回滚。

修改

我发现这个link关于EngineYard如何使用迁移实现零停机 - 他们使用Ruby但是这种方法类似于我在这里概述的方法。

答案 2 :(得分:0)

如果您对零停机时间部署感兴趣,那么有很多方法可以解决这个问题。我发现this博客文章概述了实现这一目标的不同策略。

基本要点是您在单独的时间对主应用程序进行数据库升级,并确保数据库具有可为空的列,并且代码可以调整为使列神秘地显示或消失。

作者为不同的技术提供了一些策略 - 但后来承认用hibernate做这个有点繁琐:

  

Hibernate - 在使其表现时可能会有点麻烦,   特别是如果删除列。你通常最终会创造共同点   持久化类的接口,具有多个版本的   实施课程。您可以决定要连接哪些类   在初始化之前使用模式或结果集元数据进行休眠   SessionFactory。其他持久性存在更糟糕的问题   Java中的技术,特别是喜欢的许多JPA风格   在启动时检测类的字节码。

这是一篇非常有趣的文章,我推荐阅读所有文章。

(Facebook和雅虎不使用Hibernate!)

从用户的角度来看,为了实现零停机时间,它通常涉及使用受负载均衡器保护的应用程序集群 - 因此您可以将每个应用程序从策略中删除并升级,而无需用户尝试访问它重新启动。你必须考虑会话粘性,数据源一致性和各种其他东西 - 但主要的是它不是魔术。