1. 什么是H2内存数据库
H2是一个用Java开发的嵌入式数据库,它本身是一个类库,可以直接嵌入到项目中
官网地址:H2数据库
1.1. H2用途
H2最大的用途在于可以同应用程序打包在一起发布,这样可以非常方便地少量结构化数据
用于单元测试,启动速度块,而且可以关闭持久化功能,每一个用例执行完随机还原到初始状态
作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以把它当Memcached使,作为后端Mysql/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字电表、、权限表。不过这样系统架构就会比较复杂了。
1.2. H2的产品优势
纯Java编写,不受平台的限制
只有一个jar文件,适合作为嵌入式数据库使用
H2提供了一个时份翻边的web控制台用于操作和管理数据库内容
功能完整,支持标准sql和jdbc
支持内嵌模式、服务器模式和集群
2. Springboot集成H2
2.1. 添加H2以及相关依赖
1 | <dependency> |
2.2. 配置H2相关参数
1 | spring: |
其中在resources/db
下创建表结构schema.sql
1 | create table if not exists sys_user( |
以及数据文件 data.sql,作为初始化数据
1 | -- 字段都是大写的 |
2.3. 实体关联表
给User添加@Entity注解和@Table注解
1 |
|
2.4. 创建Dao继承JpaRepository
1 |
|
2.5. 访问H2控制台
启动应用程序,通过访问H2控制台连接localhost:8080/h2
,进入H2控制台页面
进入控制台后,可以查看到初始化的数据表SYS_USER
以及数据
2.6. 创建测试类
1 |
|
3. H2数据库应用场景
3.1. 嵌入式模式(上文例子)
在嵌入式模式下,应用程序使用JDBC从同一JVM中打开数据库。这是最快也是最容易的连接方式。缺点是数据库可能只在任何时候在一个虚拟机(和类加载器)中打开。与所有模式一样,支持持久性和内存数据库。对并发打开数据库的数量或打开连接的数量没有限制
3.2. 服务器模式
当使用服务器模式(有时称为远程模式或客户机/服务器模式)时,应用程序使用 JDBC 或 ODBC API 远程打开数据库。服务器需要在同一台或另一台虚拟机上启动,或者在另一台计算机上启动。许多应用程序可以通过连接到这个服务器同时连接到同一个数据库。在内部,服务器进程在嵌入式模式下打开数据库。
服务器模式比嵌入式模式慢,因为所有数据都通过TCP/IP传输。与所有模式一样,支持持久性和内存数据库。对每个服务器并发打开的数据库数量或打开连接的数量没有限制。
3.3. 混合模式
混合模式是嵌入式和服务器模式的结合。连接到数据库的第一个应用程序在嵌入式模式下运行,但也启动服务器,以便其他应用程序(在不同进程或虚拟机中运行)可以同时访问相同的数据。本地连接的速度与数据库在嵌入式模式中的使用速度一样快,而远程连接速度稍慢。
服务器可以从应用程序内(使用服务器API)启动或停止,或自动(自动混合模式)。当使用自动混合模式时,所有想要连接到数据库的客户端(无论是本地连接还是远程连接)都可以使用完全相同的数据库URL来实现。
4. H2数据库连接格式
Connect Method | URL Format and Examples |
---|---|
Embedded (local) connection | jdbc:h2:[file:][<path>] jdbc:h2:~/test jdbc:h2:file:/data/sample jdbc:h2:file:C:/data/sample (Windows only) |
In-memory (private) | jdbc:h2:mem: |
In-memory (named) | jdbc:h2:mem: jdbc:h2:mem:test_mem |
Server mode (remote connections) using TCP/IP | dbc:h2:tcp:// jdbc:h2:tcp://localhost/ jdbc:h2:tcp://dbserv:8084/ jdbc:h2:tcp://localhost/mem:test |
Server mode (remote connections) using TLS | jdbc:h2:ssl:// jdbc:h2:ssl://localhost:8085/~/sample; |
Using encrypted files | jdbc:h2: jdbc:h2:ssl://localhost/ jdbc:h2:file: |
File locking methods | jdbc:h2: jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET |
Only open if it already exists | jdbc:h2: jdbc:h2:file:~/sample;IFEXISTS=TRUE |
Don’t close the database when the VM exits | jdbc:h2: |
Execute SQL on connection | jdbc:h2: jdbc:h2:file: |
User name and/or password | jdbc:h2: jdbc:h2:file:~/sample;USER=sa;PASSWORD=123 |
Debug trace settings | jdbc:h2: jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3 |
Ignore unknown settings | jdbc:h2: |
Custom file access mode | jdbc:h2: |
Database in a zip file | jdbc:h2:zip:<zipFileName>!/<databaseName> jdbc:h2:zip:~/db.zip!/test |
Compatibility mode | jdbc:h2: jdbc:h2:~/test;MODE=MYSQL |
Auto-reconnect | jdbc:h2: jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE |
Automatic mixed mode | jdbc:h2: jdbc:h2:~/test;AUTO_SERVER=TRUE |
Page size | jdbc:h2: |
Changing other settings | jdbc:h2: jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3 |