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

Sql 不断变化(hibernate)的数据模型,如何避免服务器关闭,sql,hibernate,tomcat,Sql,Hibernate,Tomcat,我正在构建一个使用hibernate、mysql和tomcat的Web应用程序。随着产品的发展,我不断被要求提供新功能,这通常意味着数据模型需要更改 我现在正在做的是将数据库的所有关键数据导出到一个平面文件中。关闭数据库和服务器,重新配置数据库以匹配新的hibernate映射和mysql表和列,以编程方式导入保存的数据以适应新的数据模型,然后重新启动服务器 还有什么推荐的吗?没有其他推荐的了。如果这种方法对你有效,那没关系。您还可以使用alter语句来改进数据库模式。如果由于数据量大,无法再向平

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

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


还有什么推荐的吗?

没有其他推荐的了。如果这种方法对你有效,那没关系。您还可以使用alter语句来改进数据库模式。如果由于数据量大,无法再向平面文件导出或从平面文件导入数据,请使用临时表迁移数据等。但在某些时候,数据必须以某种方式进行迁移。

您可以使用或类似的增量数据库工具,只需在升级之间添加增量即可

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

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

建议您在升级之前转储数据库,因为这样,如果出现问题,您可以快速回滚

编辑


我发现EngineYard是如何通过迁移实现零停机的——它们使用Ruby,但这种方法与我在这里概述的方法类似

如果您对零停机时间部署感兴趣,那么有很多方法可以实现这一点。我找到了一篇博客文章,其中概述了实现这一目标的不同策略

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

作者为不同的技术提供了一些实现这一点的策略,但随后承认,使用hibernate实现这一点有点麻烦:

Hibernate–在让它正常工作时可能有点麻烦, 尤其是当柱被移除时。你通常会创建一个普通的 具有多个版本的持久类的接口 实现类。您可以决定连接到哪一组类 在初始化之前使用模式或结果集元数据进行休眠 SessionFactory。其他持久性存在更糟糕的问题 Java中的技术,特别是喜欢 在启动时插入类的字节码

这是一篇伟大而有趣的文章,我建议大家都读

(Facebook和雅虎不使用Hibernate!)


从用户的角度来看,要实现零停机,通常需要使用受负载平衡器保护的应用程序群集,这样,您就可以将每个应用程序从策略中删除并升级,而无需用户在重新启动时尝试访问它。你必须考虑会话粘性、数据源一致性和各种其他东西,但主要的是它不是魔术。 我想知道雅虎和facebook如何在不中断的情况下彻底改变他们的数据库模型。