如何将 H2 嵌入式数据库读/写到 JAR 中的文件?

Posted

技术标签:

【中文标题】如何将 H2 嵌入式数据库读/写到 JAR 中的文件?【英文标题】:How to read/write H2 embedded DB to a file inside your JAR? 【发布时间】:2013-03-26 02:55:48 【问题描述】:

我有一个 Eclipse 项目,其组织方式如下:

MyProj/
    src/
        main/
            java/
                <All main Java source here>
            config/
                spring/
                    spring-config.xml
                views/
                    <All JSPs here>
                h2/
                    my-h2-db
        test/
            java/
            config/    etc. for test sources

当我将它捆绑到 WAR 中时,它是这样打包的:

MyProj.war
    META-INF/
    WEB-INF/
        web.xml
        lib/
        classes/
            spring-config.xml
            my-h2-db
            views/
                Home.jsp
                About.jsp
                etc.
            com/ --> root dir for all compiled Java binaries

我需要编写能够对 H2 数据库(以及与之配套的所有表、用户等)进行 CRUD 的代码,在这个示例中我称之为 my-h2-db。这样,无论我是在 Eclipse 内部进行测试,还是实际使用已部署的 WAR,应用程序都可以使用相同的数据库文件。

所以我问:

如何从 Eclipse 和运行时 (WAR) 类路径访问 my-h2-db 文件,因为它被打包在与 Eclipse 项目不同的位置?和

【问题讨论】:

【参考方案1】:

我认为您不会希望将 H2 文件打包到您的 WAR 应用程序中。它不能在 WAR 中使用它们。

您在版本控制中需要的是用于构建数据库实体(并在必要时预填充)的 DDL。然后,在您的开发或生产环境中,您可以使用这些脚本来创建/更新数据库。

您在 Web 应用程序中拥有的只是用于定位嵌入式数据库的 JDBC url(指定数据库的文件位置)。正如您所建议的,这将根据开发或生产环境而有所不同。

我一直使用 LiquiBase 作为管理数据库创建/升级的一种方式,它非常易于使用。

但是,在开发过程中创建数据库然后将这些文件嵌入到 WAR 中以便直接使用它们的想法是行不通的。没有保存这些文件的概念,因此没有任何数据会保留。

【讨论】:

感谢@Edh (+1) - 但是我在这里有点困惑!你是说一旦我将我的项目打包到 WAR 中,它就无法连接到位于 WAR 本身内部的 H2(嵌入式)数据库?这不就是一个“嵌入式”数据库应该有的样子吗?还是你在说别的?再次感谢! 不,嵌入式数据库是托管数据库的代码在与 jdbc 客户端相同的 JVM 中运行的地方。这并不意味着嵌入式数据库使用的文件存储在 JAR 本身中。对于大多数嵌入式数据库,它们仍然使用文件系统上的文件来保存数据。否则,所有数据都不会在 JVM 执行过程中持续存在。 啊,开始有意义。三个快速跟进:(1) 当您说“嵌入式数据库是托管数据库的代码在与 jdbc 客户端相同的 JVM 中运行的地方...”时,我对“托管数据库的代码”感到困惑数据库”和“jdbc 客户端”。你能给我一个这两个实体的具体例子吗? (2) 所以要确认:我仍然必须在某个 URL 上“安装”一个 H2 DB 文件,以便我的 WAR 可以跨运行访问它? (3) 这与像 mysql 这样的普通 RDBMS 有什么不同?再次感谢迄今为止的所有帮助! 当然...你想去聊天页面吗?爪哇? 你可以点击页面顶部的“聊天”吗?如果是这样,应该有一个名为“Java”的房间。可能适合这个。

以上是关于如何将 H2 嵌入式数据库读/写到 JAR 中的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用嵌入式数据库 H2 创建 jar 文件?

配置嵌入式 H2 用户以进行分发

将 H2 数据库嵌入 ETL 应用程序?

H2 嵌入式数据库在部署时丢失表/数据

如何在 Java 应用程序中设置 H2 嵌入式数据库以在小型网络中使用?

如何使用 H2 嵌入式数据库获取序列中的下一个值?