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

Posted

技术标签:

【中文标题】H2 嵌入式数据库在部署时丢失表/数据【英文标题】:H2 Embedded Database loses tables / data on deployment 【发布时间】:2013-09-20 19:58:59 【问题描述】:

所以我有一个应用程序,它使用一个数据库,现在我需要在应用程序中使用一个嵌入式数据库,这样你所做的就是安装程序,并且数据库已经存在(所以客户端不必须安装 mysql 服务器、wamp、xampp 等的副本才能运行 mysql 数据库)及其所有信息。

我已将应用程序导出到一个 jar 文件中,然后将其完美地制成一个 exe 文件,并且可以在我的电脑上运行,但是当我将它复制到另一台电脑并运行它时,数据库就在那里,但是表格数据和我放入的表格都不见了。我做错了什么?

提前致谢

【问题讨论】:

听起来您不小心重新初始化了数据库。也许这个 SO 线程会提供一些见解:***.com/questions/15870168/… 查看数据库文件的路径,如图here。 如果数据库嵌入在您的应用程序 jar 中,它将不可写 运行 H2 时有很多选项。你确定你没有在“内存”模式下运行它吗?在这种情况下,安装完成后一切都会丢失。 通常问题出在数据库 URL 上。您的数据库 URL 是什么,数据库文件的完整路径和名称是什么? 【参考方案1】:

有多种选择。一种选择是:

使用 SQL 语句 SCRIPT TO '~/script.sql' 从当前数据库创建 SQL 脚本文件 将文件script.sql 从用户主目录复制到应用程序的源目录,以便您可以将其捆绑为资源。使用应用程序源代码的根目录(因为这是最简单的解决方案)。 在目标计算机中,使用数据库 URL jdbc:h2:~/data;INIT=runscript from 'classpath:script.sql'。这将打开数据库并运行脚本。它将脚本作为资源读取。

还有其他选项,但它们要求您read the documentation of the H2 database。

【讨论】:

【参考方案2】:

查看一个类似的问题(使用导出到 H2 的数据库),我发现上面的答案很有用,但没有设法使 SCRIPT TO 工作。 我的数据库是 mySQL。 将数据库导出为对我有用的脚本的方法是来自 linux shell:

mysqldump -u[user] [databasename] > exportscriptfile.sql

然后我必须对脚本进行一些润色工作,以便 H2 可以阅读它(参见 this SO thread 上的类似内容)

这是我使用 jdbc EmbeddedDatabaseBuilder 工作的基于 java 的 spring 配置。此处创建为 bean 的数据源可用于任何 jdbc 调用:

@Configuration
public class H2DBConfig  

@Bean
public DataSource dataSource() 
    return new EmbeddedDatabaseBuilder()
        .setType(EmbeddedDatabaseType.H2)
        .addScript("classpath:exportscriptfile.sql")
        .build();

【讨论】:

以上是关于H2 嵌入式数据库在部署时丢失表/数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 H2 嵌入式数据库创建 H2 内存数据库

在嵌入式H2数据库中,如何防止它通过连接URL创建数据库?

使用 H2 数据库自动创建的 Spring Boot

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

带有 h2 嵌入式数据库的 MySQL LONGTEXT

当我使用 H2 数据库作为嵌入式时,Gluon 应用程序无法在 ios 上加载 FXML