一、认识 H2 数据库
1.1 H2 数据库的由来
H2
是一个Java
编写的关系型数据库,它可以被嵌入Java
应用程序中使用,或者作为一个单独的数据库服务器运行。
H2
数据库的前身是HypersonicSQL
,它的名字的含义是Hypersonic2
,但是它的代码是从头开始编写的,没有使用HypersonicSQL
或者HSQLDB
的代码。
1.2 H2 数据库的使用方式
看了上面的介绍,大多数人可能认为 H2
只有两种使用方式,实际上他的使用方式远不止于此,下面我们先用一个图展示一下 H2
的使用方式。
graph LR
A(H2 的使用方式)
B(嵌入式模式)
C(本地文件模式)
D(服务器模式)
E(内存模式)
F(混合模式)
A ---> B
A ---> C
A ---> D
A ---> E
A ---> F
style B fill:#FFC0CB,stroke:#FFC0CB,stroke-width:2px
style C fill:#FFA07A,stroke:#FFA07A,stroke-width:2px
style D fill:#FFFFE0,stroke:#FFFFE0,stroke-width:2px
style E fill:#98FB98,stroke:#98FB98,stroke-width:2px
style F fill:#00FFFF,stroke:#00FFFF,stroke-width:2px
-
嵌入式模式:在嵌入式模式下,H2数据库会作为一个库文件嵌入到应用程序中。您可以将H2的JAR文件添加到应用程序的类路径中,然后通过JDBC连接字符串来访问数据库。这种方式非常适合于需要将数据库与应用程序打包在一起的场景。
-
本地文件模式:在本地文件模式下,H2数据库以文件形式存储在本地磁盘上。您可以通过指定数据库文件路径来连接到数据库。这种方式适用于需要在多个应用程序之间共享数据库文件的情况。
-
服务器模式:H2数据库也可以作为一个独立的服务器运行,允许多个客户端通过网络连接进行访问。您可以使用H2提供的服务器模式启动脚本来启动数据库服务器,然后通过TCP/IP连接字符串连接到服务器。
-
内存模式:H2支持将数据库完全保存在内存中。这种方式非常适合于需要快速读写操作和临时存储数据的场景。连接到内存数据库的方式与连接到其他模式的方式相似,只需指定内存模式的连接字符串即可。
-
混合模式:H2还提供了混合模式,即同时支持本地文件和服务器模式。在混合模式下,您可以在本地文件模式和服务器模式之间进行切换,具有灵活的部署和管理选项。
1.3 H2 数据库的特点和特性
H2是一个功能强大、易于使用的嵌入式关系型数据库,适合于各种规模的应用程序开发和轻量级数据存储需求。它具有灵活的配置选项、高性能和良好的兼容性,成为了许多Java开发人员的首选数据库之一。下面总结一下H2 数据库的特点和特性:
graph LR
A(H2 数据库的特点和特性)
B(嵌入式数据库)
C(内存数据库)
D(支持多种连接方式)
E(支持多种数据库模式)
F(支持标准SQL语法)
G(支持事务和并发控制)
H(提供丰富的功能)
I(跨平台兼容性)
A ---> B
A ---> C
A ---> D
A ---> E
A ---> F
A ---> G
A ---> H
A ---> I
style B fill:#FFC0CB,stroke:#FFC0CB,stroke-width:2px
style C fill:#FFA07A,stroke:#FFA07A,stroke-width:2px
style D fill:#FFFFE0,stroke:#FFFFE0,stroke-width:2px
style E fill:#98FB98,stroke:#98FB98,stroke-width:2px
style F fill:#ADD8E6,stroke:#ADD8E6,stroke-width:2px
style G fill:#B2FFFF,stroke:#B2FFFF,stroke-width:2px
style H fill:#E6E6FA,stroke:#E6E6FA,stroke-width:2px
style I fill:#EEDD82,stroke:#EEDD82,stroke-width:2px
-
嵌入式数据库: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来进行内存缓存步骤
graph LR
A(导入H2依赖)
B(创建H2数据库)
C(建立连接)
D(创建表)
E(缓存数据)
F(检索数据)
G(更新和删除数据)
A --> B --> C --> D --> E --> F --> G
-
导入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 添加依赖
<!-- 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的语法和行为保持一致。
<!-- 这里使用了`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
语句来创建表和插入数据。(这个在实际情况中主要用于预加载)
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
方法中执行创建表和插入数据的操作。
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
)来执行数据库操作。
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 做内存缓存的优点
graph LR
A(H2做内存缓存的优点)
B(SQL支持)
C(快速读写)
D(低延迟)
E(简单轻量)
F(数据持久化选项)
I(个人认为这是最大优点)
H(这些优点别的内存缓存几乎也有)
A ---> B --> I
A ---> C --> H
A ---> D --> H
A ---> E --> H
A ---> F --> H
style B fill:#FFC0CB,stroke:#FFC0CB,stroke-width:2px
style C fill:#FFA07A,stroke:#FFA07A,stroke-width:2px
style D fill:#FFFFE0,stroke:#FFFFE0,stroke-width:2px
style E fill:#98FB98,stroke:#98FB98,stroke-width:2px
style F fill:#B2FFFF,stroke:#B2FFFF,stroke-width:2px
style I fill:#EEDD82,stroke:#EEDD82,stroke-width:2px
style H fill:#E6E6FA,stroke:#E6E6FA,stroke-width:2px
SQL支持:H2
数据库支持SQL
语法和功能,可以使用标准的SQL
查询语句来操作内存数据库中的数据。这使得开发人员可以利用熟悉的SQL
知识进行数据操作和查询,提供了更大的灵活性和便利性。
快速读写:H2
数据库的内存模式将数据完全加载到内存中,因此读写操作非常快速。与传统的磁盘数据库相比,内存数据库无需进行磁盘I/O
操作,可以直接在内存中读写数据。这种快速的读写能力使得内存数据库非常适合用作缓存,可以大大提高缓存的读取和写入性能。
低延迟:由于内存数据库直接在内存中操作数据,所以具有非常低的访问延迟。缓存是用于快速获取数据的存储介质,低延迟的特性使得内存数据库能够快速响应读取请求,提供即时的数据访问。
简单轻量:H2
数据库是一个嵌入式数据库,可以非常容易地集成到应用程序中。内存模式下的H2
数据库不需要独立的数据库服务器,所有数据都存储在应用程序进程的内存中。这使得部署和维护变得简单,而且不需要额外的数据库管理。
数据持久化选项:尽管内存数据库的数据存储在内存中,但H2
数据库提供了持久化选项,可以将内存中的数据定期或实时地保存到磁盘上。这样可以保证在应用程序重启或崩溃时不会丢失缓存数据,并且可以在应用程序启动时快速加载先前缓存的数据。
四、总结
本文整体介绍了一下H2
数据库,并详细说了一下用H2
怎么实现内存缓存,案例代码都是贴的一些核心的内容,全篇贴进来篇幅过大,请见谅。
希望本文能给你带来帮助,如有错误或建议,欢迎指正和提出。