一、认识 H2 数据库
1.1 H2 数据库的由来
H2
是一个Java
编写的关系型数据库,它可以被嵌入Java
应用程序中使用,或者作为一个单独的数据库服务器运行。
H2
数据库的前身是HypersonicSQL
,它的名字的含义是Hypersonic2
,但是它的代码是从头开始编写的,没有使用HypersonicSQL
或者HSQLDB
的代码。
1.2 H2 数据库的使用方式
看了上面的介绍,大多数人可能认为 H2
只有两种使用方式,实际上他的使用方式远不止于此,下面我们先用一个图展示一下 H2
的使用方式。
-
嵌入式模式:在嵌入式模式下,H2数据库会作为一个库文件嵌入到应用程序中。您可以将H2的JAR文件添加到应用程序的类路径中,然后通过JDBC连接字符串来访问数据库。这种方式非常适合于需要将数据库与应用程序打包在一起的场景。
-
本地文件模式:在本地文件模式下,H2数据库以文件形式存储在本地磁盘上。您可以通过指定数据库文件路径来连接到数据库。这种方式适用于需要在多个应用程序之间共享数据库文件的情况。
-
服务器模式:H2数据库也可以作为一个独立的服务器运行,允许多个客户端通过网络连接进行访问。您可以使用H2提供的服务器模式启动脚本来启动数据库服务器,然后通过TCP/IP连接字符串连接到服务器。
-
内存模式:H2支持将数据库完全保存在内存中。这种方式非常适合于需要快速读写操作和临时存储数据的场景。连接到内存数据库的方式与连接到其他模式的方式相似,只需指定内存模式的连接字符串即可。
-
混合模式:H2还提供了混合模式,即同时支持本地文件和服务器模式。在混合模式下,您可以在本地文件模式和服务器模式之间进行切换,具有灵活的部署和管理选项。
1.3 H2 数据库的特点和特性
H2是一个功能强大、易于使用的嵌入式关系型数据库,适合于各种规模的应用程序开发和轻量级数据存储需求。它具有灵活的配置选项、高性能和良好的兼容性,成为了许多Java开发人员的首选数据库之一。下面总结一下H2 数据库的特点和特性:
-
嵌入式数据库:H2可以以嵌入式模式与应用程序一起使用,通过将数据库作为库文件嵌入到应用程序中,实现轻量级的数据存储和管理。
-
内存数据库:H2还支持将数据库完全保存在内存中,这种方式非常适合需要快速读写操作和临时存储的场景。
-
支持多种连接方式:H2可以使用多种连接方式与应用程序进行交互,包括嵌入式连接、本地文件连接、TCP/IP连接和SSL加密连接等。这使得它非常灵活,可以根据应用程序的需求进行配置。
-
支持多种数据库模式:H2支持多种数据库模式,包括内存数据库、文件数据库、服务器模式和混合模式等。这使得它适用于不同的应用场景和部署需求。
-
支持标准SQL语法:H2支持标准的SQL语法,包括DDL(数据定义语言)和DML(数据操作语言),使得开发人员可以使用熟悉的SQL语句进行数据库操作。
-
支持事务和并发控制:H2提供了事务支持和并发控制机制,可以确保数据的一致性和并发访问的正确性。
-
提供丰富的功能:除了基本的数据库功能,H2还提供了一些高级功能,如支持索引、触发器、存储过程、用户定义函数、嵌入式Web控制台等。
-
跨平台兼容性:H2数据库是纯Java实现的,因此具有良好的跨平台兼容性,可以在各种操作系统和Java环境中运行。
二、 如何使用 H2 来做内存缓存
看了上面的内容,你就知道实际 H2
的应用场景非常之多,本文主要介绍一下怎么使用 H2
来实现内存缓存。
2.1 使用H2来进行内存缓存步骤
-
导入H2依赖 :在你的项目中,添加
H2
数据库的依赖项。具体的步骤取决于你使用的构建工具,例如Maven
或Gradle
。 -
创建H2数据库:在你的应用程序中,使用H2数据库的内嵌模式创建一个数据库。这将在内存中启动一个H2数据库实例。
-
建立连接 :使用
Java
代码建立与H2数据库的连接。你可以使用H2
提供的JDBC
驱动程序来连接到数据库。 -
创建表 :使用
SQL
语句在H2
数据库中创建一个或多个表,用于存储缓存数据。你可以使用H2
支持的标准SQL语法创建表。 -
缓存数据 :通过执行插入语句将数据存储到
H2
数据库的表中。这样,你的数据将被缓存到内存中的H2
数据库中。 -
检索数据 :通过执行查询语句从
H2
数据库中检索缓存数据。根据你的需求,你可以编写适当的查询语句来获取所需的数据。 -
更新和删除数据 :如果需要更新或删除缓存数据,你可以执行相应的更新或删除语句来修改
H2
数据库中的数据。
2.2 使用 Spring Boot 来集成H2,做一个案例
本小章节我将带着实现用Spring Boot来实现一下集成H2。注意,这里的实现步骤和上面的流程图是一致的。
2.2.1 添加依赖
java
<!-- H2数据库依赖 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
2.2.2 配置数据源
注意:在下面配置中,使用了
jdbc:h2:mem:testdb
来指定H2数据库的内存模式,并设置了DB_CLOSE_DELAY=-1
来保持数据库持久化,以便在应用程序关闭后保留数据。MODE=MYSQL
用于设置H2数据库的模式为MySQL模式,以便与MySQL的语法和行为保持一致。
java
<!-- 这里使用了`jdbc:h2:mem:testdb`来指定H2数据库的内存模式 -->
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MYSQL
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
2.2.3 创建表和插入数据
- 编写
SQL
脚本:创建一个data.sql
文件,放置在src/main/resources
目录下,并编写SQL
语句来创建表和插入数据。(这个在实际情况中主要用于预加载)
sql
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
INSERT INTO users (id, name) VALUES (1, '张三');
INSERT INTO users (id, name) VALUES (2, '李四');
- 使用
Spring
的数据库初始化功能:你可以在Spring
的配置类中使用@Bean
注解定义一个InitializingBean
,并在其afterPropertiesSet
方法中执行创建表和插入数据的操作。
java
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
public class DatabaseInitializationConfig {
private final JdbcTemplate jdbcTemplate;
public DatabaseInitializationConfig(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Bean
public InitializingBean initializeDatabase() {
return () -> {
// 这里可以换成读取文件来执行
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(100))");
jdbcTemplate.execute("INSERT INTO users (id, name) VALUES (1, '张三')");
jdbcTemplate.execute("INSERT INTO users (id, name) VALUES (2, '李四')");
};
}
}
2.2.4 使用数据库
现在,可以在Spring
项目中使用H2
数据库。可以通过注入JdbcTemplate
或使用其他持久化框架(如MyBatis
)来执行数据库操作。
java
import org.springframework.jdbc.core.JdbcTemplate;
public class UserService {
private final JdbcTemplate jdbcTemplate;
public UserService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void getUsers() {
List<Map<String, Object>> users = jdbcTemplate.queryForList("SELECT * FROM users");
for (Map<String, Object> user : users) {
System.out.println("ID: " + user.get("id") + ", Name: " + user.get("name"));
}
}
}
到这里我们就完成了内存模式的H2
链接了,后面的使用都是使用标准的SQL
来操作,这里不多做赘述
三、使用 H2 做内存缓存的优点
SQL支持 :H2
数据库支持SQL
语法和功能,可以使用标准的SQL
查询语句来操作内存数据库中的数据。这使得开发人员可以利用熟悉的SQL
知识进行数据操作和查询,提供了更大的灵活性和便利性。
快速读写 :H2
数据库的内存模式将数据完全加载到内存中,因此读写操作非常快速。与传统的磁盘数据库相比,内存数据库无需进行磁盘I/O
操作,可以直接在内存中读写数据。这种快速的读写能力使得内存数据库非常适合用作缓存,可以大大提高缓存的读取和写入性能。
低延迟:由于内存数据库直接在内存中操作数据,所以具有非常低的访问延迟。缓存是用于快速获取数据的存储介质,低延迟的特性使得内存数据库能够快速响应读取请求,提供即时的数据访问。
简单轻量 :H2
数据库是一个嵌入式数据库,可以非常容易地集成到应用程序中。内存模式下的H2
数据库不需要独立的数据库服务器,所有数据都存储在应用程序进程的内存中。这使得部署和维护变得简单,而且不需要额外的数据库管理。
数据持久化选项 :尽管内存数据库的数据存储在内存中,但H2
数据库提供了持久化选项,可以将内存中的数据定期或实时地保存到磁盘上。这样可以保证在应用程序重启或崩溃时不会丢失缓存数据,并且可以在应用程序启动时快速加载先前缓存的数据。
四、总结
本文整体介绍了一下H2
数据库,并详细说了一下用H2
怎么实现内存缓存,案例代码都是贴的一些核心的内容,全篇贴进来篇幅过大,请见谅。
希望本文能给你带来帮助,如有错误或建议,欢迎指正和提出。