当前位置: 首页 > 知识库问答 >
问题:

我可以使用内存模式将一些数据持久化到H2数据库中吗?

潘涵煦
2023-03-14

我想使用h2作为数据库,在内存模式下准确保存数据。

所以我有一个应用程序。属性文件,配置如下:

spring.h2.console.enabled=true
spring.jpa.show-sql=true
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=...
spring.datasource.password=...
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.session.jdbc.initialize-schema=always

使用特定参数

DB_CLOSE_DELAY=-1-保持数据库打开/保持内存中数据库的内容,只要虚拟机是活动的
DB_CLOSE_ON_EXIT=FALSE-禁用数据库关闭退出

如H2数据库文档所述。

同时,我使用实体保存在数据库中:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity(name = "address_entity")
@Table(name = "addresses")
public class GeolocationAddress {

    public GeolocationAddress(GeolocationAddressDTO geolocationAddressDTO) {
        this.displayName = geolocationAddressDTO.getDisplayName();
        this.lat = geolocationAddressDTO.getLat();
        this.lon = geolocationAddressDTO.getLon();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "address_id")
    private Integer id;

    private String displayName;

    private String lat;

    private String lon;
}

发送请求后,我将从Hibernate状态获取控制台信息:

Hibernate: insert into addresses (address_id, display_name, lat, lon) values (null, ?, ?, ?)
Hibernate: insert into addresses (address_id, display_name, lat, lon) values (null, ?, ?, ?)

但在使用组合键Ctrl/kbd>F5或通过以下方式刷新数据源中的数据库之后:

凯,我没有看到任何数据。

为了研究这种行为,我检查了文档中的配方:

对于某些用例(例如:快速原型、测试、高性能操作、只读数据库),可能不需要持久化数据或持久化对数据的更改。此数据库支持内存模式,其中数据不会持久化

以及一些文章,例如:

“根据设计,内存中的数据库是易失性的,当我们重新启动应用程序时,数据会丢失。”

或者这个:

“H2是内存中的数据库。它不是持久化数据库。H2是一个很好的学习工具,因为您需要零设置。”

但我仍然不完全理解,在应用程序运行时,我可以以这种模式保存数据吗?

如果我切换到其他模式,例如:

spring.datasource.url=jdbc:h2:file:./data/demo;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

正如这里和这里提到的。

然后,是的,我在刷新后看到数据库中的数据,数据将以如下格式保存:

但是,我是否可以对内存中的执行相同的操作?

如能对此作出任何澄清,我将不胜感激。

UPD#1:

例如,这里指出:

"大多数内存数据库系统都提供持久性,至少作为一种选择。"

UPD#2:

H2控制台我看到数据使用in-内存模式,但从Intellij Idea-不是:

UPD#3:如图灵85所述,我已经测试了url:jdbc:h2:tcp://localhost/mem:db1通过TCP/IP或TLS访问数据库,但此链接在数据源中无效。

经过一些调查,我发现了有用的信息:

": mem不适用于TCP连接。所以从连接url中删除: mem"

所以,另一种方法是:<代码>jdbc:h2:/数据/测试数据库;AUTO\u SERVER=TRUE;AUTO\u SERVER\u PORT=10990也可以工作。

UPD#4:可能,这个答案也与我的问题有关。

共有1个答案

沈鸿光
2023-03-14

正如Turing85、Elliott Frisch和M.Deinum所提到的,内存中的数据库与正在运行的Spring Boot应用程序隔离,这就是为什么我需要使用其他模式,例如:

spring.datasource.url=jdbc:h2:file:./data/testdb;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

spring.datasource.url=jdbc:h2:./data/testdb;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=10990
 类似资料:
  • 我的应用程序有3个组件, 1) 一种面向用户的组件,接收请求并将其存储到数据库中。2)一个后端组件,从数据库中读取数据,进行处理并将其发送到外部系统。3) 存储用户输入的数据库 我如何测试流程是这样的:用户输入数据- 注意:我尝试使用ddl auto:update,但它不起作用。

  • 我在研究内存数据库的概念。有关这方面的文章说, 内存数据库系统是一种将数据完全存储在主存中的数据库管理系统。 他们讨论了这个概念的优点和缺点。 我的问题是如果这些数据库管理系统将数据完全存储在主存储器中, 停电后所有数据都消失了吗??? 还是有办法保护数据???

  • 我正在使用Quartz与Spring集成来安排工作。为了保存quartz数据,我在spring配置中提供了一个数据源。 以上内容将把数据持久化到datasource中配置的一个模式中。我需要做的是将quartz数据存储到多个模式中。 我怎么做得到?

  • 目的 配置 NFS 共享为 OpenShift 节点提供存储,并且配置 OpenShift 持久卷以绑定至数据库 Pod。 环境 openshift v3.11.16/kubernetes v1.11.0 步骤 配置 NFS 共享持久卷1. 登录到 NFS 服务器 # ssh nfs.example.com2. 创建 config-nfs.sh 脚本,内容如下 #!/usr/bin/sh exp

  • 本文向大家介绍内存型数据库Redis持久化小结,包括了内存型数据库Redis持久化小结的使用技巧和注意事项,需要的朋友参考一下 因为Redis是内存型数据库,所以为了防止因为系统崩溃等原因导致数据丢失的问题,Redis提供了两种不同的持久化方法来将数据存储在硬盘里面,一种方法是快照(RDB),它可以将存在于某一个时刻的所有数据都写入到硬盘里面,另外一种方法是只追加文件(AOF),它会在执行写命令时

  • 问题内容: 我遇到了使用EntityManager将元素持久保存到数据库的问题。根据我发现的答案,我在DaoJpa中尝试了这4种方法来执行此操作,但仍然失败。在这里,我附上了我尝试过的四种方法: 控制器部分中的代码: 1.道霸: 不起作用! 2。 我得到的例外:没有正在进行的交易 3。 我得到的异常:不允许在共享的EntityManager上创建事务-使用Spring事务或EJB CMT代替 4。