简介
H2数据库是一个纯用java开发的开源数据库。只有一个类库(即只有一个2M大小的 jar 文件),可以直接嵌入到应用项目中。
已经了解并决定使用H2的小伙伴请跳过这里瞎扯,直接看到下面 使用h2数据库。
H2数据库有很多优点,官网是这么说的:
- Very fast, open source, JDBC API(速度贼拉快,开源免费可以白嫖,支持JDBC)
- Embedded and server modes; in-memory databases(可以当作内嵌数据库来使用,像Sqlite那样;可以当作客户-服务端数据库来使用,像MySql、Postgresql那样;可以当作内存/缓存数据库)
- Browser based Console application(支持浏览器的控制台应用,不用额外安装任何桌面应用程序。)
- Small footprint: around 2 MB jar file size(只要一个2MB大小的jar包就可以使用)
H2数据库特性
下面表格内的数据来自官网:https://h2database.com/html/main.html
H2 | Derby | HSQLDB | MySQL | PostgreSQL | |
Pure Java | Yes | Yes | Yes | No | No |
Memory Mode | Yes | Yes | Yes | No | No |
Encrypted Database | Yes | Yes | Yes | No | No |
ODBC Driver | Yes | No | No | Yes | Yes |
Fulltext Search | Yes | No | No | Yes | Yes |
Multi Version Concurrency | Yes | No | Yes | Yes | Yes |
Footprint (embedded) | ~2 MB | ~3 MB | ~1.5 MB | 不支持 | 不支持 |
Footprint (client) | ~500 KB | ~600 KB | ~1.5 MB | ~1 MB | ~700 KB |
为什么要使用 H2 ?
在java开发的时候尤其还在测试阶段,再安装其他的数据库比较麻烦。这时候可以使用 H2 数据库来临时代替那些 Oracle、MySql、Postgresql 等主流的数据库,因为他只需要导入一个 jar 包就能用了。
或者你要开发的程序规模不是很大,最多几十万的数据量,这时候 H2 的性能也完全可以 hold 住。
还有一个好处就是 H2 数据库提供了一个网页版的数据库管理工具。如果只使用简单的 SQL 语句,可以省去安装 navicat、phpMyAdmin 这类软件。(这个小工具还挺好用,不仅能链接h2数据库,还能链接 MySql、Postgresql、SQLLite等多种数据库)
他长下面那样:
总之,方便就是了。
H2的几种使用方式
- 嵌入式模式(使用 JDBC 的本地连接)
类似HSQLDB、Derby、SQLite等可以集成到程序中,而不要安装额外的数据库软件。 - 服务器模式(使用 JDBC 或 ODBC 在 TCP/IP 上的远程连接)
- 混合模式(本地和远程连接同时进行)
应用场景总结
- 可以同应用程序打包在一起发布,在储存的数据量不大的情况下,避免再安装其他数据库等繁琐的操作。
- 可用于单元测试。
- 可以用作缓存,即当做内存数据库,。
H2数据库与其他主流数据库性能比较
以下测试内容来自官方测试数据。下面的表格分别将H2与其他数据的运行时间和系统内存使用情况进行了对比测试。
数据只有部分内容,查看完整内容请至:https://h2database.com/html/performance.html
内嵌数据库之间的较量(对比的HSQLDB和Derby两个数据库也都是用java开发的嵌入式数据库):
测试内容 | 单位 | H2数据库 | HSQLDB数据库 | Derby数据库 |
Simple: Init | ms | 1019 | 1907 | 8280 |
Simple: Query (random) | ms | 1304 | 873 | 1912 |
Simple: Query (sequential) | ms | 835 | 1839 | 5415 |
Simple: Update (sequential) | ms | 961 | 2333 | 21759 |
Simple: Delete (sequential) | ms | 950 | 1922 | 32016 |
Simple: Memory Usage | MB | 21 | 10 | 8 |
客户-服务端数据库之间的较量:
测试内容 | 单位 | H2(Server模式) | HSQLDB数据库 | Derby数据库 | PostgreSQL数据库 | MySql数据库 |
Simple: Init | ms | 16338 | 17198 | 27860 | 30156 | 29409 |
Simple: Query (random) | ms | 3399 | 2582 | 6190 | 3315 | 3342 |
Simple: Query (sequential) | ms | 21841 | 18699 | 42347 | 30774 | 32611 |
Simple: Update (sequential) | ms | 6913 | 7745 | 28576 | 32698 | 11350 |
Simple: Delete (sequential) | ms | 8051 | 9751 | 42202 | 44480 | 16555 |
Simple: Memory Usage | MB | 22 | 11 | 9 | 0 | 1 |
H2数据库还是有缺点的。比如从上面就可以看出来内存使用明显比其他的要多,而且据说在以前的版本中出现过数据丢失的或者损坏的情况,但是stackoverflow上的大佬说1.2.147版本以后,就没发生过数据损坏或者缺失的情况(没亲身测试过,但是现在都1.4+版本了,因该不会有什么问题)。
H2相关链接
- 官网:https://h2database.com/
- Github:https://github.com/h2database/h2database
- 开源协议:MPL 2.0 (Mozilla Public License Version 2.0)
使用H2数据库
1. 下载安装
- 下载安装 H2
官网地址:https://h2database.com/html/download.html在下载页面有下面两个 下载 选项:
Version 1.4.200 (2019-10-14)
-------------------------------------------------------------------------------------------
Windows Installer (SHA1 checksum: 12710a463318cf23c0e0e3f7d58a0f232bd39cfe)
Platform-Independent Zip (SHA1 checksum: 5898966bbca0b29ee02602fb84e0eb90ec92eec2)
......
第一个是windows的安装程序。第二个是一个压缩包,相当于“绿色版”,无需安装。
这里下载第二个。
- 目录介绍
将下载的zip包解压后得到以下目录结构(现在是2020-10,使用的是2019-10-14 1.4.200 版本,以后或者其他版本可能会有不同)。
|- bin
|- h2.bat
|- h2w.bat
|- h2.sh
|- h2-1.4.200.jar
|- docs
|- service
|- src
|- build.bat
|- build.sh
说明:
docs : 是H2说明文档的离线版本,里面都是些 html/pdf 之类的文件。
service : 通过wrapper包装成服务相关文件。
src : H2数据库的源代码
build.bat : windows构建脚本
build.sh : linux构建脚本
bin -> h2.bat : windows启动脚本(启动时会有个黑窗口在那里)
bin -> h2w.bat : windows启动脚本,后台静默启动(启动后没有黑窗口)
bin -> h2.sh : linux启动脚本
bin -> h2-1.4.200.jar : 打包好的jar包。如果想要嵌入到你的程序中,只要引入这个jar就可以了(或者使用maven/gradle等)。
2. 使用 H2 Shell 工具启动数据库。
在 bin 目录下运行java -cp h2-xxx.jar org.h2.tools.Shell
,只要根据引导程序,就可以一步一步的创建数据库。
如下:
PS C:\h2\bin> java -cp .\h2-1.4.200.jar org.h2.tools.Shell
Welcome to H2 Shell 1.4.200 (2019-10-14)
Exit with Ctrl+C
[Enter] jdbc:h2:~/test
URL
[Enter] org.h2.Driver
Driver
[Enter] sa
User
Password
Connected
Commands are case insensitive; SQL statements end with ';'
help or ? Display this help
list Toggle result list / stack trace mode
maxwidth Set maximum column width (default is 100)
autocommit Enable or disable autocommit
history Show the last 20 statements
quit or exit Close the connection and exit
sql> select * from test
...
上面的操作中,创建 test 数据库。 JDBC URL链接方式为:jdbc:h2:~/test
。这会在用户目录下生成一个 test.mv.db 文件,这个文件就是数据库文件。并设置数据库管理员为 sa ,密码为空(只有本地模式,才支持空密码)。
如果不想将数据库文件创建在用户目录下,可以使用jdbc:h2:[file:][<path>]<databaseName>
格式指定数据库保存路径。
如果要直接在内存中创建数据库,而将数据持久化到本地保存,则使用 jdbc:h2:mem:<databaseName>
格式。
H2还支持其他Database URL写法,参考官网:Database URL
用户目录,windows为:C:\Users\登录的用户名
提示:
- 使用本地格式 url (如:jdbc:h2:~/test)链接 H2 ,如果没有此数据库,则会自动创建这个数据库(远程连接情况下则默认报错)。如果要禁止默认创建不存在的数据的这种行为,可以在 URL 后添加 ;
IFEXISTS=TRUE
即可,如jdbc:h2:/data/sample;IFEXISTS=TRUE
。
3. 以Server模式启动H2数据库
双击h2.bat启动数据库,会自动用默认浏览器打开数据库管理页面。如果没自动打开,也可以手动在浏览器输入URL:http://localhost:8082进入数据库管理页面。(见上面的截图)
设置数据库端口号等配置的配置文件在用户目录有个 .h2.server.properties 文件,如:C:\Users\zhangsan.h2.server.properties。
使用这种方式启动 h2 后,右下角会有个黄色的小的数据库图标可以用来创建数据库/或者打开数据库控制台页面等(如下图)。
右击数据库图标:
- H2 Console - 点击打开浏览器 Console
- Create a new Database... - 点击弹出窗口来创建数据库
- Status - 显示浏览器链接数据库链接
- Exit
使用h2.bat打开的黑窗口不要关,要想不要黑色窗口可以双击h2w.bat启动。
h2数据库还有其他方式启动,这里不做详细介绍了,有兴趣的可以看官方文档。
4. 在项目中使用 H2 数据库
你可以直接把上面下载的H2数据库的jar包复制到项目的lib中,或者使用Maven来管理。
Maven依赖
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
数据库配置:
//数据库连接URL
private static final String JDBC_URL = "jdbc:h2:~/test";
//用户名
private static final String USER = "sa";
//密码
private static final String PASSWORD = "";
//数据库驱动
private static final String DRIVER_CLASS="org.h2.Driver";
使用JDBC操作H2数据库
public class H2ConnTest1 {
//数据库连接URL
private static final String JDBC_URL = "jdbc:h2:~/test";
//用户名
private static final String USER = "sa";
//密码
private static final String PASSWORD = "";
//数据库驱动
private static final String DRIVER_CLASS="org.h2.Driver";
public static void main(String[] args) throws Exception {
// 加载H2数据库驱动
Class.forName(DRIVER_CLASS);
// 根据连接URL,用户名,密码获取数据库连接
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
//如果存在USER_INFO表就先删除USER_INFO表
stmt.execute("DROP TABLE IF EXISTS PERSON");
//创建USER_INFO表
stmt.execute("CREATE TABLE PERSON(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
//新增
stmt.executeUpdate("INSERT INTO PERSON VALUES('" + UUID.randomUUID()+ "','张三','男')");
//删除
stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='张三'");
//修改
stmt.executeUpdate("UPDATE USER_INFO SET name='张三' WHERE name='王二麻子'");
//查询
ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
//遍历结果集
while (rs.next()) {
System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
}
//释放资源
stmt.close();
//关闭连接
conn.close();
}
}
当程序运行起来的时候,会自动启动 H2 数据库,如果url格式是本地格式,会自动创建数据库。其他操作和常规MySQL、Postgresql数据库相似。
要注意的是如果你只在测试阶段使用 H2 数据库,而生产阶段将会替换成其他数据库的话,你要注意他们二者之间的区别。