MariaDB / H2总览对比
| 项目 | H2 | MariaDB |
|---|---|---|
| 类型 | 嵌入式/内存关系数据库,Java编写 | 开源关系型数据库,MySQL分支 |
| 运行模式 | 内存模式、文件模式、服务模式 | 独立服务进程 |
| 适用场景 | 单元测试、开发环境、小工具演示、内嵌程序 | 生产业务库,高并发、大数据量 |
| 驱动类 | org.h2.Driver |
org.mariadb.jdbc.Driver |
| JDBC URL | 内存:jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 文件:jdbc:h2:file:./data/db |
jdbc:mariadb://127.0.0.1:3306/dbname |
| 兼容性 | SQL接近MySQL,部分函数差异 | 高度兼容MySQL语法 |
| 优势 | 无需安装,随Java程序启动关闭;支持web控制台;速度快;零部署 | 稳定、事务、索引优化、主从复制、集群、大量运维工具 |
| 短板 | 不适合生产;并发能力弱;断电内存模式数据丢失;文件模式数据量有限 | 需要独立部署维护,占用资源 |
1. H2 Database
纯Java实现,最常用做单元测试内存数据库,SpringBoot内置支持。
三种运行模式
-
内存模式 mem 数据完全在内存,程序关闭数据丢失。
spring.datasource.url=jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
DB_CLOSE_DELAY=-1:最后一个连接关闭不销毁数据库,单元测试必备。
-
文件模式 file 数据持久化到磁盘文件,程序重启数据保留。
jdbc:h2:file:./h2data/mydb
-
服务模式 tcp H2作为独立服务,可以多进程远程连接,很少使用。
SpringBoot集成H2
pom依赖
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
application.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
username: sa
password:
h2:
console:
enabled: true # 开启web控制台 http://localhost:8080/h2-console
path: /h2-console
H2注意坑点
- 内存模式:应用重启数据全部清空;
- 大小写、自增、部分mysql函数不兼容(
find_in_set、group_concat等行为不一样); - 并发性能差,禁止生产使用;
- web控制台不要暴露到公网;
- MyBatis‑Plus、JPA单元测试非常适合H2内存库。
典型用法:开发测试环境用H2,正式环境切换MariaDB/MySQL。
2. MariaDB
MySQL的开源分支,由原MySQL开发团队维护,绝大多数MySQL语法、驱动、配置几乎通用。
Maven依赖
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb‑java‑client</artifactId>
</dependency>
不要继续使用旧的mysql‑connector‑java,新项目优先mariadb驱动,也可以连接MySQL。
SpringBoot配置
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
关键特性
- 字符集优先
utf8mb4,支持完整emoji;mysql的utf8只是3字节; - 支持主从复制、Galera集群;
- 存储引擎 InnoDB(默认,支持事务ACID,行锁);MyISAM不支持事务;
- 支持视图、存储过程、触发器、分区表;
- 向下兼容MySQL,迁移成本极低。
MariaDB vs MySQL小差异
- 部分系统函数、系统表名字略有区别;
- MariaDB有更多内置引擎;
- 授权语法、索引语法大体一致;
- 驱动包完全不一样,驱动类名不同。
生产最佳实践
- 必用InnoDB;
- 主键建议自增bigint;
- 避免大事务;
- 合理建立索引,避免回表;
- 开启慢查询日志优化SQL;
- 连接池配置(HikariCP):最大连接数不要设置过大。
3. H2 ↔ MariaDB 切换开发模式
很多项目配置两套profile:
dev:profile 使用H2内存库,不需要本地装数据库,跑单元测试、本地快速开发;prod:profile 使用MariaDB生产数据库。
⚠️注意:SQL脚本要尽量兼容两者,否则切换会报错。H2对MySQL方言支持有限。
常见踩坑对比
| 场景 | H2 | MariaDB |
|---|---|---|
| 自增主键 | AUTO_INCREMENT 支持,但行为略有差异 |
AUTO_INCREMENT |
| 分页 | LIMIT offset,size 支持 |
LIMIT offset,size |
| 函数 | GROUP_CONCAT部分版本行为不同 |
完整支持GROUP_CONCAT |
| 事务 | 支持,但并发弱 | InnoDB完整事务、MVCC |
| DDL | 部分语法不支持 | 完整DDL |
4. HikariCP连接池搭配(SpringBoot默认)
不管H2还是MariaDB底层都是HikariCP。
spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 5
idle-timeout: 300000
connection-timeout: 30000
如果你需要,我可以补充:
- MyBatis‑Plus下H2+MariaDB多profile完整yml示例;
- H2兼容MySQL模式配置;
- MariaDB常用调优参数(my.cnf);
- H2单元测试标准模板。