为什么是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文档。
参考链接