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
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