Spring Boot H2嵌入式整合

Spring Boot H2 嵌入模式整合

需求

我们已经有一个成熟的WEB报表产品结构了,是BS架构.

但是在业务场景上,部分定制项目或者说产品需要做单机版.给用户安装的单机版不适合大家统一使用一个远程的数据库服务,我们不得不去研究嵌入式数据库到我们的项目中,让我们的单机版自身带有数据库服务.

H2使用场景

H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中。H2 主要有如下三个用途:

  • 也是最常使用的用途就在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据(嵌入模式)。
  • 用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态(内存模式)。
  • 作为缓存,即当做内存数据库,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表(内存模式)

H2启动模式

  • 内存模式:数据无法持久化 jdbc:h2:mem:***
  • 嵌入模式:jar包直接跟随后台服务,数据持久化到文件系统 jdbc:h2:file:***
  • 服务模式:当成远程的数据库服务,提供给应用程序 jdbc:h2:tcp:***

嵌入模式整合

  • Spring Boot 与 H2 整合十分的简单,直接引用 com.h2database:h2 版本号使用 Spring Boot提供的就可以

  • 注意事项;

    • 1
      H2 数据库报错 Database "XXX" not found, and IFEXISTS=true, so we cant auto-create it [90146] 的解决办法
    • 以前的h2数据库当没有数据库的时候,会自动创建一个空的数据库,但是在2019年的版本后,禁止了这项功能,所以如果你对这个功能不在意可以使用 下面的老版本依赖,会自动创建数据库

    • 1
      2
      3
      4
      5
      <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.4.193</version>
      </dependency>
    • 另外一种解决方法就是,版本号还是使用 Spring Boot提供的h2默认版本号,在配置文件中修改如下

    • 1
      spring.datasource.url=jdbc:h2:file:./h2/data2;IFEXISTS=FALSE;
    • 注意:只这样写还是无法自动创建数据库,我们需要手动根据这个地址在启动成功后,手动连接一次数据库

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      @SpringBootApplication
      public class DesktipApplication {
      public static final Logger LOGGER = LoggerFactory.getLogger(DesktipApplication.class);


      public static void main(String[] args) throws SQLException {
      ConfigurableApplicationContext run = SpringApplication.run(DesktipApplication.class, args);
      String url = run.getEnvironment().getProperty("spring.datasource.url");
      String username = run.getEnvironment().getProperty("spring.datasource.username");
      String password = run.getEnvironment().getProperty("spring.datasource.password");
      //h2 新版本的已经 不能直接创建空的数据库,尝试根据 jdbc链接一次,创建数据库
      Connection connection = DriverManager.getConnection(url, username, password);
      connection.close();
      LOGGER.info("启动成功");

      }
      }
    • 常用的配置信息

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      ##h2数据库 IFEXISTS=FALSE 没有数据库的时候自动创建 AUTO_SERVER=TRUE 混合模式
      spring.datasource.driver-class-name=org.h2.Driver
      #jdbc:h2:file:{path} path可以写绝对路径 也可以写相对路径 ~代表当前用户目录 .代表当前目录
      spring.datasource.url=jdbc:h2:file:./h2/data2;IFEXISTS=FALSE;AUTO_SERVER=TRUE
      spring.datasource.username=sa
      spring.datasource.password=
      #开启console 可以通过浏览器访问数据库页面
      spring.h2.console.enabled=true
      #开启h2 console 跟踪 方便调试 默认 false
      spring.h2.console.settings.trace=false
      #允许console 远程访问 默认false
      spring.h2.console.settings.web-allow-others=true
      # h2 访问路径上下文 默认为 h2-console
      spring.h2.console.path=/h2-console