H2内存数据库简介和使用经验

2年前 (2022) 程序员胖胖胖虎阿
184 0 0

H2官网:H2 Database Engine (redirect)

H2使用:

1. 通过embed模式,直接整合进Spring中

1.1. pom.xml中引入依赖

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>

 200以前的版本个人建议还是别用了,问题多多

1.2. spring配置文件中,可进行相应的配置

spring.h2.console.enabled=true # 是否启用h2控制台
spring.h2.console.path=/h2 # 访问的路径
spring.h2.console.settings.trace=false
spring.h2.console.settings.web-allow-others=true

1.3. datasource配置

spring.datasource.url=jdbc:h2:~/h2demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;AUTO_SERVER=TRUE;
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

1.4. 其余的配置和spring+mybatis和其他数据库类似,此处不展开

样例代码参考:kelvinzheng/h2demo

 H2界面:

H2内存数据库简介和使用经验

H2内存数据库简介和使用经验

 2. 使用参数

官网:H2 Database Engine

源码:https://github.com/h2database/h2database

 官网学习的时候个人感觉还是比较麻烦的,一开始不知道怎么入手,去学习的伙伴可以自行体会

 几个点分享一下:

a. 如果知道参数名,那可以直接搜

H2内存数据库简介和使用经验

b. 通篇学习可以进入featrues下,相应的功能和参数可以在这个下面看

 Features

3. 比较坑的点

3.1. 写多的场景

一言难尽,如果你的业务场景下有大量的和大数据量的写入,不适合用h2,因为它的物理文件是单文件的,就是上方jdbc:h2:~/h2demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;AUTO_SERVER=TRUE;中的h2demo,它会在对应的目录中生成h2demo.mv.db,用于存储数据(类似redis的rdb)

当你有大量的事务时,此文件会急速膨胀,慢慢将内部的操作步骤消费后,文件会逐步缩小

然后第一坑就出现了,此时如果宕机,会带来两个问题

a. 再次启动时报错(低概率),吓人不

b. 再次启动时需要花费很长的时间(因为物理文件太大,有可能几分钟都启动不好,>_<)

例如这个就是说明文件不断增大的缺陷(作者在里面回答):

https://github.com/h2database/h2database/issues/301

3.2. 大表调整索引

也是一样的问题,可能会直接报错,然后就再也起不来了

3.3. 锁超时 

默认时间短,一秒钟,可以调整LOCK_TIMEOUT参数

3.4. H2 database error: Database may be already in use: “Locked by another process”

原因是,使用默认的jdbc连接,只能一个连接,第二个就会报这个错,可以加AUTO_SERVER参数解决

3.5. 写线程被interrupt也可能导致无法再启动,例如多线程写的场景下,如果将线程中h2正在写入,此时线程被干掉的话,可能会导致h2无法正常启动;

4. 其他说明

a. async (jdbc:h2:async:)这个参数可以加一下,在linux服务器上可以降低上面问题产生的概率(只是降低,在项目中使用的一点点经验,加了后比没加前问题产生的概率变低了,但还是会出现)

b. AUTO_RECONNECT:自动重连,可以加一下AUTO_RECONNECT=TRUE

c. AUTO_SERVER:开发环境下可以加这个,用于多人连接

d. h2可以单独启动:https://h2database.com/html/download.html 下载zip,解压后进入目录h2\bin,h2.bat或者h2.sh启动h2,就是单独的进程,不是embed模式随主程序启停了​​​​​​​

性能

本人在linux机器上做过一个压测(16C32G)

插入(Insert into table (sid,sname),量级从1W、10W、100W)大约在20W/秒 左右

更新(update table set sname=?,量级从1W、10W、100W)这个性能掉的很厉害,上百万后只剩10/秒左右

查询(select * from table,量级从1W、10W、100W),大约是20W/秒 左右

这个大家自己在机器上测吧,磁盘CPU不一样,数据差异挺大的

所以推荐读多写少的场景下使用

-- 有缘登山,寒山不寒

版权声明:程序员胖胖胖虎阿 发表于 2022年11月11日 上午2:32。
转载请注明:H2内存数据库简介和使用经验 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...