如何将 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 中的文件?的主要内容,如果未能解决你的问题,请参考以下文章