暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

内存数据库H2实战:介绍、使用以及和Spring Boot集成

Scala语言 2021-09-23
3569





0 1
什么是H2数据库?



H2数据库[1]的特点:

  • 非常快,开源,支持JDBC API

  • 嵌入式和服务器模式;内存数据库

  • 基于浏览器的控制台应用程序

  • 占用空间小,jar只有2MB大小

以上只是官网列出的特点。


由于本身是由纯Java其实还有跨平台的优势,支持目前常见的大部分平台。


和其他常见数据库之间的对比如下:




0 2
使用场景



  • 嵌入式数据库。由于额外的资源占用较少,所以比较适合需要嵌入式数据的场景。

  • 快速数据处理。临时想用SQL来做一些数据的处理的工作,又不想安装MySQL服务器之类的软件,那么H2可以快速投入使用。




0 3
SQL的兼容性



所有的数据库引擎行为都会有一定的差异。H2除了支持ANSI SQL标准之外,也尝试对其他数据库做一些兼容[2](MODE=XX)。


比如,MYSQL默认是大小写不敏感,H2是大小写敏感。实际上,H2也支持大小写不敏感,只需要在创建数据库添加参数IGNORECASE=TRUE,比如jdbc:h2:~/test;IGNORECASE=TRUE


需要注意的是,兼容模式不代表所有的差异都已经被处理,实际实现的只有一小部分差异的子集。可以兼容的数据库有DB2,Derby,HSQLDB,MS SQL Server,MySQL,Oracle,PostgreSQL,Ignite。


比如兼容DB2的SQL模式,可以如下来配置:

jdbc:h2:~/test;MODE=DB2




0 4
集成Spring Boot和数据源配置



Spring Boot集成其实非常简单,只需要添加依赖和配置数据源即可。


笔者用的是maven来管理依赖,因此在POM文件中添加H2的依赖。由于我同时使用了Druid的数据库连接池,所以也添加了Druid的jar包。


            <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    </dependency>
            <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
    </dependency>


    注意,这里配置的时候不需要配置版本号,因为在引入spring-boot-dependencies BOM的时候,已经自带了版本号的配置。


    比如笔者使用的spring-boot版本是2.4.2,可以看到在spring-boot-dependencies-2.4.2.pom文件中的H2数据库的版本是

      <h2.version>1.4.200</h2.version>


      接下来,我们通过Spring的应用程序属性字段来配置数据源,达到使用H2的效果。笔者用的是application.yaml,配置如下。如果使用application.properties,配置是完全一样的。

        spring:
        datasource:
        #Fully qualified name of the connection pool implementation to use. By default, it is auto-detected from the classpath.
        #数据库连接池
            type: com.alibaba.druid.pool.DruidDataSource
        # 驱动
        # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
        driver-class-name: org.h2.Driver
        #数据库连接地址
        # h2 内存数据库 内存模式连接配置 库名: testdb
        url: jdbc:h2:mem:testdb
        username: sa
        password:
        # # 初始化数据表 DDL
        # schema: classpath:sql/init.sql
        # # 初始化数据 DML
        # data: classpath:sql/data.sql


        h2:
        console:
        enabled: true
        settings:
        # 开启h2 console 跟踪 方便调试 默认 false
        trace: true
        # 允许console 远程访问 默认false
        web-allow-others: true
        # h2 访问路径上下文
        path: h2-console


        配置完成之后,启动应用程序,数据库就会自动生成。


        这是这么做到的呢?

        • 程序启动时,确保h2*.jar在classpath上

        • 使用H2的org.h2.Driver

        • 通过H2的UR(比如:jdbc:h2:~/test)来打开在Home目录下的test数据库

        • 数据库会由H2自动创建。


        由于我们在application.yaml中配置了H2的控制台,因此我们可以通过浏览器连接数据库。在地址栏中输入http://localhost:9001/h2-console就可以进入H2数据的控制台。


        注意:红框中的要和配置的保持一致。如果没有配置密码,则直接连Connect就可以进入DB。



        进入数据之后,界面主要分为左右两边,左边是数据库,右边是操作区。如下:


        如果要想数据保存的话,那么可以将数据库从内存数据库修改到文件系统。




        0 5
        H2的URL有哪些??



        内嵌式数据库:

          jdbc:h2:~/test 'test' in the user home directory
          jdbc:h2:/data/test 'test' in the directory /data
          jdbc:h2:./test in the current(!) working directory

          内存数据库

            jdbc:h2:mem:test multiple connections in one process
            jdbc:h2:mem: unnamed private; one connection

            服务器模式

            启动服务:

              java -cp *.jar org.h2.tools.Server

              连接:

                jdbc:h2:tcp://localhost/~/test user home dir
                jdbc:h2:tcp://localhost//data/test absolute dir

                配置H2服务器:

                  jdbc:h2:..;MODE=MySQL compatibility (or HSQLDB,...)
                  jdbc:h2:..;TRACE_LEVEL_FILE=3 log to *.trace.db




                  0 6
                  结论



                  本文中,我们考察了H2数据的特点、应用场景、兼容性,以及如何和当下流行的Spring框架集成。可以看出,H2是一款小巧但是完备的数据库,在测试、临时数据处理、内嵌式快速开发上很有特点。


                  接下来,我将会尽量选择一些有趣的干活内容来尝试写作,可以保证的是,干货满满。



                  参考:

                  [1] 官网地址:http://www.h2database.com/html/main.html

                  [2] H2的SQL兼容性:http://www.h2database.com/html/features.html#compatibility

                  [3] Spring Aplication Properties:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties

                  [4] https://segmentfault.com/a/1190000020636564




                  欢迎关注公众号:

                  文章转载自Scala语言,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论