前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >补习系列(18)-springboot H2 迷你数据库

补习系列(18)-springboot H2 迷你数据库

作者头像
美码师
发布2019-03-19 16:18:16
7500
发布2019-03-19 16:18:16
举报
文章被收录于专栏:美码师

关于 H2

H2 数据库是一个纯 Java 实现的开源的嵌入式数据库,笔者第一次使用时还是在多年前的一个客户端项目中。 当时就觉得这个数据库很方便,如果你希望你的应用程序能"自带数据库,随处运行”,那么H2是个不错的选择。

H2 的由来

H2 的前身是 HyperSQL(HSQL),后者也是一个类似的嵌入式数据库,H2的作者 Thomas Mueller 一开始就是 HSQL的贡献者。 到后来因为一些未知的原因分成了两个项目分支,H2 大概就是第二代的意思..

有什么特性

  • 由于是Java写的,自带跨平台能力
  • 小,非常的小,完整的 Jar 包只有1-2M
  • 支持多种模式,包括内存形态、文件形态(持久化)

一般来说,使用H2 的场景大概会是:

  1. 计算资源受限,如嵌入式计算环境中,由于CPU、内存、Disk等限制,要求采用小巧的数据库存储方案;
  2. 项目预研,在项目立项之前可能无法立即采购昂贵的数据库软件,此时往往可以退而选择临时解决方案,利用JDBC协议的通用性在后期完成切换;
  3. 自动化测试,在自动化环境中可能需要大量模拟接口,包括数据存储接口,此时内存数据库是不二之选。

接下来,介绍两种使用方式

一、H2 用作本地数据库

1. 引入依赖:

代码语言:javascript
复制
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId>    <version>${spring-boot.version}</version></dependency>
<dependency>    <groupId>com.h2database</groupId>    <artifactId>h2</artifactId>    <version>1.4.196</version></dependency>

2. 配置文件

编辑 application.properties

代码语言:javascript
复制
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)spring.datasource.url=jdbc:h2:file:D:/temp/h2spring.datasource.username=spring.datasource.password=
# The SQL dialect makes Hibernate generate better SQL for the chosen databasespring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect
# Hibernate ddl auto (create, create-drop, validate, update)spring.jpa.hibernate.ddl-auto = update

其中 jdbc:h2:file:D:/temp/h2 将指示H2 启用本地文件模式,数据库文件将写入 D:/temp/h2 这个目录。

3. 样例数据

LogRecord.java

代码语言:javascript
复制
@Entity@Table(name="log_record")    public class LogRecord {
    @Id    @GeneratedValue(strategy = GenerationType.AUTO )    private Long id;
    private String level;
    private String message;
    private Date createTime;

LogRepository.java

代码语言:javascript
复制
@Repositorypublic interface LogRecordRepository extends JpaRepository<LogRecord, Long> {}

LogRecordInitializer.java

代码语言:javascript
复制
@Servicepublic class LogRecordInitializer {
    @Autowired    private LogRecordRepository logRecordRepository;    private static final Logger logger = LoggerFactory.getLogger(LogRecordInitializer.class);
    @PostConstruct    void initData(){
        if(logRecordRepository.count() > 0){
            List<LogRecord> logRecords = logRecordRepository.findAll();
            logger.info("read records: {}", JsonUtil.toPrettyJson(logRecords));            return;        }        for(int i=0; i<100; i++){
            LogRecord record = new LogRecord();            record.setLevel("info");
            record.setMessage("Heartbeat message " + UUID.randomUUID().toString());            record.setCreateTime(new Date());
            logRecordRepository.save(record);
            logger.info("save record - " + record.getMessage());        }
    }}

实现的逻辑大致是,第一次启动时写入100条数据,后面每次启动将数据读取出来并打印到日志。

执行SpringBoot 启动程序,发现目录中生成了h2.mv.db文件,说明写入成功!

二、H2 用于单元测试

H2 数据库的典型应用是 在Web项目中做单元测试。

一般,测试的流程为:

  1. 数据初始化
  2. 执行测试
  3. 销毁数据

在真实的测试代码开发中,有几类问题会造成困扰:

  1. 数据库环境的搭建比较费时费力;
  2. 数据库的数据难以保持"干净",一些垃圾数据容易影响测试的成功率

H2作为内存数据库使用则能解决这些问题,本身作为内置数据库并不需要额外的看护成本, 而且在程序退出时,所有数据都能保证完全清除。

1. 依赖包

代码语言:javascript
复制
<!-- springboot test --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-test</artifactId>    <version>${spring-boot.version}</version>    <scope>test</scope></dependency>
<dependency>    <groupId>com.h2database</groupId>    <artifactId>h2</artifactId>    <version>1.4.196</version>    <scope>test</scope></dependency>

2. 测试配置

编辑 src/test/resources/application.properties

代码语言:javascript
复制
# 数据源连接spring.datasource.url=jdbc:h2:mem:test# DDL脚本spring.datasource.schema=classpath:script/test-schema.sql# DML脚本spring.datasource.data=classpath:script/test-data.sql
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialectspring.jpa.hibernate.ddl-auto = update

3. 测试代码

代码语言:javascript
复制
@RunWith(SpringRunner.class)@SpringBootTest(classes = BootJpa.class)public class CityViewRepositoryTest {
    @Autowired    private CityViewRepository cityViewRepository;
    @Test    public void testGetAll(){
        List<CityView> views = cityViewRepository.findAll();        System.out.println(JsonUtil.toPrettyJson(views));    }
}

小结

本篇介绍了 H2 数据库常用的两种使用场景。尽管此前也写过关于H2 做单元测试的文章, 但除此之外,其作为嵌入式数据库也是不错的选择,从行业趋势来看,终端计算对于嵌入式DB的需求会越来越多,后面也是比较看好的。 与H2 类似的数据库还有HSQL、Derby,有兴趣的朋友可以研究对比下。

欢迎继续关注"美码师的补习系列-springboot篇" ,期待更多精彩内容^-^

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 美码师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于 H2
  • 一、H2 用作本地数据库
    • 1. 引入依赖:
      • 2. 配置文件
        • 3. 样例数据
        • 二、H2 用于单元测试
          • 1. 依赖包
            • 2. 测试配置
              • 3. 测试代码
              • 小结
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档