为什么是h2
方便开发 h2数据库可以作为一个嵌入式的数据库使用,在开发环境种使用非常方便。不像mysql等数据库需要专门启动一个数据库服务,并做相关配置。可以大大减少开发时的环境配置成本。
方便测试 h2数据库可以作为单元测试种使用的数据库。和第一点类似,利用h2数据的嵌入式的特点,在单元测试种使用该数据库将大大的降低配置成本。
方便部署 即使是在生产环境中,我也非常非常推荐使用h2。因为该数据库真的是非常的轻便,非常有利于程序的发布。过去如果使用mysql这种数据库,在发布前还需要先将mysql服务器开启,并建立相关db。而使用h2,你几乎可以完全忽略这些过程。程序发布的过程,你只需要集中在将程序运行起来即可。
性能不错 h2在一定程度上,性能完全不弱于mysql。如果你的程序的用户不超过1w,那么我觉得h2在性能上完全可以和mysql媲美。至于更大的数据量和用户数是否能够满足需求,我也不知道。对于初创产品而言,我觉得h2在性能上绝对已经满足开发者的需求了。
只需要很少的资源 目前如果在要服务器上运行起mysql服务,那么内存就会占据约500mb。如果你的服务器只有1g的内存,那么随着程序运行,mysql会占据更多的资源,接着就会导致资源不够使用,mysql服务被关闭。而使用h2就完成没有这样的问题。h2占据的资源非常的少,几乎不会被你察觉。
快速开始
h2和mysql很大的一个区别是,你不需要在连接数据库之前创建数据库。如果在连接数据库时,h2发现没有该数据库,其会自动新建数据库文件。因此最快体验h2的方法,就是直接去连接一个h2数据库就可以了。下面举个用h2 shell连接数据库的例子。
step1
运行如下命令java -cp h2*.jar org.h2.tools.Shell
,h2*.jar
文件是h2
的运行文件,你可以在官网上下载到。
step2
根据提示输入URL:jdbc:h2:mem:test
。
step3
根据提示输入Driver:org.h2.Driver
。
step4
根据提示输入User:root
。
step5
根据提示输入Password:123456
。
step last
这个时候你已经成功的连接到了数据库,并可以通过SQL语句对数据库进行操作了。在上面的步骤当中,你连接到了内存当中的test
数据库,虽然他开始不存在,但是h2自动帮你新建了该数据库。除了在内存种存储数据库文件外,你也可以在文件中存储数据库,你只需要把URL改成jdbc:h2:~/test
,其便会连接~/test
路径对应的数据库。
什么是h2 web console
h2 web console
是一个GUI的数据库管理工具,通过他你可以很方便的管理你的数据库。他的作用就相当于PhpMyAdmin
。我一般会在开发环境开启h2 web console
。当然应用没有后台管理这样的工具的话,我也会在生产环境开启h2 web console
。
启动h2 web console
运行java -cp h2*.jar org.h2.tools.Console
命令变可启动h2 web console
。运行该命令后,在结果输出种可以看到h2 web console
的访问地址。h2*.jar
文件是h2
的运行文件,你可以在官网上下载到。
远程访问 h2 web console
h2 web console
默认是只能在本地访问的。也就是说如果你在远程服务器上开启了h2 web console
那么你是没有办法在自己的电脑上访问h2 web console
的。为了能在远程访问h2 web console
,就需要开启h2 web console
的远程访问功能。
运行如下命令 java -cp h2*.jar org.h2.tools.Console -webAllowOthers
。使用该命令打开的h2 web console
就可以在远程访问。h2*.jar
文件是h2
的运行文件,你可以在官网上下载到。
h2 shell模式
h2的shell模式,你可以理解为是h2的命令行。你在该模式下可以通过各种命令行和SQL语句对数据库进行操作。
运行如下命令java -cp h2*.jar org.h2.tools.Shell
,便打开了h2的shell模式。运行该命令后你还需要根据提示输入DRIVER CLASS
、URL
、USER NAME
、PASSWORD
。h2*.jar
文件是h2
的运行文件,你可以在官网上下载到。
h2的连接模式
h2
有三种运行模式,分别是Embedded Mode
、Server Mode
、Mixed Mode
。
Embedded Mode
嵌入模式:在该模式下,程序会直接连接数据库,访问数据库文件。该模式的运行效率是最高的。
特点:该模式虽然效率最高,但是在该模式下数据库将只有当前程序可以访问,其他程序是不能访问数据库的。
URL:
jdbc:h2:~/test
URL:
jdbc:h2:mem:test
在内存种运行
Server Mode
服务模式。在该模式下,数据库将会运行在一个数据库连接服务上。程序通过访问数据库连接服务访问数据库。
特点:该模式的性能不如嵌入模式,但是他可以支持多个程序访问数据库。
URL:
jdbc:h2:tcp://localhost/~/tes
URL:
jdbc:h2:ssl://localhost:8085/~/sample;
Mixed Mode
混合模式:该模式,集合了嵌入模式和服务模式的优点。他使得数据库性能和嵌入模式一样,同时又支出多个程序一同连接。
背后实现:如果你是第一个连接该数据库的程序,那么你相当于是用嵌入模式连接数据库。如果你是第二个或者之后连接的数据库,那么你就相当于是用服务模式连接的数据库。
URL:
jdbc:h2:~/test;AUTO_SERVER=TRUE
h2 数据库备份
方法一: 在h2 shell模式下运行backup to '~/backup.zip'
,其中~/backup.zip
是备份的地址。该命令会备份一个完整的数据库。
方法二: 在数据库文件目录下运行java -cp h2*.jar org.h2.tools.Backup -file ~/backup.zip
,~/backup.zip
是备份的地址。该命令会备份一个完整的数据库。但是该方法不能在数据库被连接时时运行。
h2 数据库还原
在数据库文件目录下运行java -cp h2*.jar org.h2.tools.Restore -file ~/backup.zip
,~/backup.zip
是备份的地址。该命令会还原一个完整的数据库。但是该方法不能在数据库被连接时时运行。
以SQL的形式导出h2数据库
方法一: 在h2 shell 模式下运行script to '~/backup.sql'
,其中~/backup.sql
是备份的地址。
方法二: 在数据库文件目录下运行java -cp h2*.jar org.h2.tools.Script -url jdbc:h2:~/test -user root -password 123456 -script ~/backup.sql
,jdbc:h2:~/test
是数据库地址,root
是用户名,1123456
是秘密,~/backup.sql
是保存sql的地址。该方法数据库不能被使用时运行。
以SQL的形式还原h2数据库
方法一: 在h2 shell 模式下运行runscript from '~/backup.sql'
,其中~/backup.sql
是备份的地址。并且只有确保导出目标db是空的才能顺利导入,否则会有冲突。 解决方案是在运行该方法前运行drop all objects
方法二: 在数据库文件目录下运行java -cp h2*.jar org.h2.tools.RunScript -url jdbc:h2:~/test -user root -password 123456 -script ~/backup.sql
,jdbc:h2:~/test
是数据库地址,root
是用户名,1123456
是秘密,~/backup.sql
是保存sql的地址。但是该方法不能在数据库被连接时时运行。另外只有确保导出目标db是空的才能顺利导入,否则会有冲突。
位运算
在mysql当中,如果sql语句中需要位运算,可以直接使用&
、|
这些符号。但是在h2中需要使用sql函数才能实现。具体可以参考Functions文档。
参考链接
官网
Starting and Using the H2 Console
Settings of the H2 Console
Creating New Databases
Using Databases in Web Applications
Upgrade, Backup, and Restore
Command Line Tools
The Shell Tool
Database URL Overview
Functions