【问题标题】:Database generation when deploying war to Tomcat将战争部署到 Tomcat 时的数据库生成
【发布时间】:2012-01-27 16:38:23
【问题描述】:

我的 webapp 有一个 war 文件,当我将 war 从 Tomcat 复制到 webapps 文件夹时,我需要在 MySQL 中生成数据库表(假设 Tomcat 正在运行)。

有没有办法做到这一点,你能帮我提供一些关于这方面的信息吗?

PS。这是一个非常简单的 webapp,只使用 JDBC,我不使用任何 ORM 框架。 JDBC可以吗?

【问题讨论】:

    标签: java mysql tomcat deployment war


    【解决方案1】:

    如果您只想更新架构,但又不想引入像 Hibernate 这样重量级的东西,有一些不错的选择:

    • Flyway - 为您的应用程序提供迁移脚本,以便在部署时对其进行更新。
    • Liquibase - 提供架构的 XML 描述,并允许 Liquibase 更新架构。

    Flyway 要求您编写 SQL 以在应用程序的不同版本之间进行迁移。它根本不会生成任何 DDL(用于修改模式的 SQL)。它只是运行你给它的 SQL。如果您熟悉 SQL,并且希望能够使用您的数据库提供的所有功能,我强烈建议您这样做。

    可以将启动迁移的代码放入 ServletContextListener。 Flyway Application Integration 页面上给出了可以在那里使用的示例代码。

    Liquibase 通过读取描述将数据库升级到最新架构所需的架构更改的 XML 文件来工作。这些更改按顺序应用。这意味着您的架构和更改更有可能移植到其他数据库,但可以说更难利用特定于您的数据库的功能。

    Liquibase 提供了自己的 ServletContextListener 供您使用。请参阅文档中的 ServletListener 页面。

    如果您确实想引入 ORM,可以查看:

    • Hibernate - ORM 有很多特性(以及很多依赖项)
    • EclipseLink - 以前是 Oracle TopLink。这似乎比 Hibernate 更精致,但功能更少。

    【讨论】:

    • 对于我不打算分发的专有应用程序,我会使用 Flyway。如果我正在编写一个开源应用程序并想支持许多数据库,我可能会倾向于 Liquibase。
    【解决方案2】:

    在自定义 ServletContextListener 类的 contextInitialized() 方法中完成这项工作。这将在 webapp 启动时调用。

    @WebListener
    public class Config implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent event) {
            // Just write/call JDBC code here the usual way to create database/tables if not exists.
        }
    
        // ...
    }
    

    也就是说,使用 JPA/Hibernate 之类的 ORM 框架确实可以让您免于很多 JDBC 样板代码和令人头疼的问题。

    【讨论】:

      【解决方案3】:

      听起来像是:http://www.hibernate.org/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 2015-04-22
        • 2016-07-11
        相关资源
        最近更新 更多