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界面:
2. 使用参数
官网:H2 Database Engine
源码:https://github.com/h2database/h2database
官网学习的时候个人感觉还是比较麻烦的,一开始不知道怎么入手,去学习的伙伴可以自行体会
几个点分享一下:
a. 如果知道参数名,那可以直接搜
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不一样,数据差异挺大的
所以推荐读多写少的场景下使用
-- 有缘登山,寒山不寒