我可以使用内存模式将一些数据保存到 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/IP
或 TLS
访问数据库,但此 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
我想使用 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
如前所述
然后,是的,我在刷新后看到数据库中的数据,数据将以如下格式保存:
但是我可以对 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:
如前所述 经过一些调查,我发现 useful information: ":mem will not work for TCP connections. so remove :mem from
connection url" 替代方法如: 更新#4:
大概,这个jdbc:h2:tcp://localhost/mem:db1
通过 TCP/IP
或 TLS
访问数据库,但此 link 在 Data Source
.[=50= 中无效]
jdbc:h2:./data/testdb;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=10990
也有效。
如前所述 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