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

Can I persist some data into H2 database using in-memory mode?

我想使用 h2 作为数据库将数据准确保存在 in-memory mode 中。

所以我有 application.properties 个配置如下的文件:

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 - 保留数据库 open/to 只要虚拟机还活着就保留内存数据库的内容
DB_CLOSE_ON_EXIT=FALSE - 禁用数据库在退出时关闭

H2 database 的文档中所述。

同时,我正在使用 Entity 保存在数据库中:

@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, ?, ?, ?)

但在 Data Source 中刷新 H2 数据库后使用 Ctrl+F5 组合或通过:

关键,我没有看到任何数据。

为了研究这种行为,我检查了 documentation:

中的公式

"For certain use cases (for example: rapid prototyping, testing, high performance operations, read-only databases), it may not be required to persist data, or persist changes to the data. This database supports the in-memory mode, where the data is not persisted."

和一些 articles,例如:

"By design, the in-memory database is volatile, and data will be lost when we restart the application."

this一个:

"H2 is an in memory database. Its not a persisted database. H2 is a great tool for learning because you need zero setup."

但我还是不太明白,我可以在应用程序处于运行时以这种模式保存数据吗?

如果我换成另一种模式,例如:

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

如前所述 and here.

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

但是我可以对 in-memory 做同样的事情吗?

如有任何澄清,我将不胜感激。

UPD #1:

比如表示:

"Most in-memory database systems offer persistence, at least as an option."

UPD #2:

来自 H2-console 我使用 in-memory 模式查看数据,但来自 Intellij Idea - 不是:

更新#3: 如前所述 , I've tested url: jdbc:h2:tcp://localhost/mem:db1 通过 TCP/IPTLS 访问数据库,但此 link 在 Data Source.[=50= 中无效]

经过一些调查,我发现 useful information:

":mem will not work for TCP connections. so remove :mem from connection url"

替代方法如:jdbc:h2:./data/testdb;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=10990 也有效。

更新#4: 大概,这个也和我的问题有关

如前所述 , and in-memory 数据库与 运行 Spring 启动应用程序隔离,这就是我需要使用其他模式的原因,例如:

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