从类路径打开 H2 数据库
Posted
技术标签:
【中文标题】从类路径打开 H2 数据库【英文标题】:Open H2 Database from Classpath 【发布时间】:2018-10-31 16:56:03 【问题描述】:我从 H2 文档中看到您 can open files on the classpath。
我在打开连接时尝试了各种 URL(例如 jdbc:h2:classpath:/myDatabase
),但似乎没有找到资源 - 但当我尝试 MyClass.class.getClassLoader().getResourceAsStream("myDatabase")
时,它可以找到它。
数据库位于src\test\resources
的类路径中。
任何想法我做错了什么?
【问题讨论】:
正确的格式是这样的:jdbc:h2:file:/data/sample
。您也可以尝试使用相对文件名
@Ivan Exception in thread "main" org.h2.jdbc.JdbcSQLException: A file path that is implicitly relative to the current working directory is not allowed in the database URL "jdbc:h2:file:/data/myDatabase". Use an absolute path, ~/name, ./name, or the baseDir setting instead. [90011-194] at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
你打算如何包装这个? src 听起来好像它不在您的类路径上,但是在您打包/运行程序时作为资源放置在那里。你不应该真的期望资源是可写的,但我怀疑你的数据库将会是。所以有些东西没有正确排列。
如果你不能让它工作(我也不能)作为替代方案,你可以尝试一个内存数据库,它只设置到已保存数据库的链接?
你检查过这个答案了吗,***.com/a/6507639/2067492 似乎是从 jar 文件创建一个文件系统。您是否考虑过将数据库读入内存并创建内存数据库?
【参考方案1】:
这对我有用...它在类路径中创建 pher 文件夹,“pharmadatabase”是我的数据库名称。
jdbc:h2:file:pher/~/pharmadatabase;
你可以看到下面的路径-
【讨论】:
Exception in thread "main" org.h2.jdbc.JdbcSQLException: A file path that is implicitly relative to the current working directory is not allowed in the database URL "jdbc:h2:file:project/~/myDatabase;". Use an absolute path, ~/name, ./name, or the baseDir setting instead. [90011-194]
这真的适合你吗?
是的,它对我有用......这是 src 代码......你可以查看github.com/Fathma/PharmacyProject/tree/master/pharmacy,这是数据库连接github.com/Fathma/PharmacyProject/blob/master/pharmacy/src/phar/…【参考方案2】:
您可以找到myDatabase
文件。在本地运行并解包时,例如您可以在 IDE 内部执行以下操作:
URL res = MyClass.class.getResource("/myDatabase");
String url = "jdbc:h2:" + res.toString();
这将输出完整的资源路径,例如jdbc:h2:file:/home/.../classes/myDatabase
当您将应用打包为 JAR 或 WAR 时,这将不起作用。在这种情况下,myDatabase
将被打包在一个 ZIP 存档中,引用this post:
压缩数据库和数据库中的主要问题 类路径是:你不能做真正的随机访问。你只能从 一条溪流。需要随机访问,所以模拟如下: 当 seek(pos) 大于当前位置时,则进行跳过 (这基本上是一个阅读)。如果 seek pos 较小,则 流已关闭并重新打开。这很慢。
ZIP 支持是只读的,基于 Advanced > Pluggable File System docs:
zip:基于只读 zip 文件的文件系统。格式:zip:/zipFileName!/fileName.
您可能应该使用命令行参数或系统变量提供myDatabase
的路径,并将其保留在打包的应用程序之外。
【讨论】:
我知道潜在的解决方法,但如果 H2 提供从类路径中的数据库读取的能力,我想尽可能尝试一下。 @Jakg 根据我引用的帖子和解释我不相信有从类路径读取的选项。您可以将 URL 解析为资源,但在 JAR 中可能无法正常工作。以上是关于从类路径打开 H2 数据库的主要内容,如果未能解决你的问题,请参考以下文章
我试图在 h2 嵌入式数据库中插入 blob 数据,但它从类路径/URI 失败。但是它适用于绝对路径
传单地图'polygonData.default(data)中的错误:不知道如何从类data.frame的对象中获取路径数据'