1.H2简介


H2是纯JAVA编写的轻量级数据库,类似于HSQLDB,但比HSQLDB好用多了。使用非常方便,无需安装,你就可以在程序中启动数据库服务器、连接、创建数据库,客户端连接也不需要任何安装,只要有IE即可。官网http://www.h2database.com/html/main.html。下载后bin目录下会有数据库驱动包,假设名叫h2-1.3.162.jar,如果你不需要看源代码,就这一个文件就够用了,启动数据库及连接数据库所用的资源都在里面了。为了方便,我们将它改名为h2.jar。

2.H2启动与连接

H2数据库启动选项可通过java -classpath h2.jar org.h2.tools.Server -?查询,如下:

1)文件方式启动

严格来说应该叫文件方式连接,因为文件方式启动不需要先启动数据库服务器,直接在连接URL中填写绝对或相对路径即可,由于创建数据库连接时,H2引擎发现指定的路径下如果不存在数据库,则会自动创建,如:

Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:file:~/test", "sa", "");

这段代码可以正常执行,其中file表示以文件方式启动数据库连接,但如果是第一次使用,可能不知道H2把数据库创建在了什么位置,熟悉linux的会知道~符号表示系统当前用户的主文件夹,所以(以win7为例),上面这段代码会在C:\Users\Administrator目录下创建名为test的数据库,用户名为sa,密码为空(用户名密码在首次创建时可以随意设置)。由于H2默认连接方式就是文件方式,所以file关键字可以省略,也就是说,在win7下,以下三种写法是等价的:

Connection conn = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");
Connection conn = DriverManager.getConnection("jdbc:h2:file:~/test", "sa", "");
Connection conn = DriverManager.getConnection("jdbc:h2:file:C:/Users/Administrator/test", "sa", "");


以上的三种写法使用的是绝对路径,在实际应用中,你可能会希望程序在哪运行,就是哪创建数据库,所以会用到相对路径,如:

Connection conn = DriverManager.getConnection("jdbc:h2:file:h2db/test", "sa", "");

当执行以上代码时,H2会在JAVA程序运行的根目录下创建h2db文件夹,然后在h2db下创建test数据库。

如果数据库已经创建,下次再进行连接时,就必须提供与第一次创建时一致的用户名密码,否则将连接不成功。

另外需要强调的是,以文件方式连接数据库时,H2引擎会新建两个守护线程,一个用来锁文件,一个用来写文件:


所以这种方式是独占的,即当以文件方式连接数据库所创建的Connection如果没有关闭,不允许再有其他的进程以文件方式连接此数据库。如果尝试连接,将会报以下错误:

Exception in thread "main" org.h2.jdbc.JdbcSQLException: Database may be already in use: Locked by another process. Possible solutions: close all other connection(s); use the server mode [90020-72]
 at org.h2.message.Message.getSQLException(Message.java:92)
 at org.h2.message.Message.getSQLException(Message.java:96)
 at org.h2.message.Message.getSQLException(Message.java:74)

所以文件方式不适合做类似数据库连接池的应用。

2)使用web控制台

在讲完一种启动方式时需要先讲一下H2的web控制台,然后再讲更高级的数据库启动方式。因为无论以哪一种数据库方式启动数据库,你都可以使用web控制台来连接,并执行CRUD操作,非常方便,要启动web控制台,可以执行java -classpath h2.jar org.h2.tools.Console -web,登陆界面如下:

登陆成功后,可以在里面直接执行SQL语句:



3)tcp方式启动

tcp方式启动时,H2将在本地启动一个tcp服务器,你可以用客户端连接至此端口访问不同的数据库,这种方式支持多客户端。在启动数据库时,你不需要指定具体数据库(因为在连接时才需要指定),只需指定需要监听的端口即可,如:

java -classpath h2.jar org.h2.tools.Server -tcp

这样即可启动数据库服务器了,由于你没有指定端口,所以H2将监听默认端口9092,如果你想指定端口,需要使用tcpPort参数,如:

java -classpath h2.jar org.h2.tools.Server -tcp -tcpPort 9092

注意,此种方式启动后,你将可以在本地通过9092访问H2数据库,但不允许其他机器访问,如果你希望从其他机器也能通过此端口访问数据库,就需要用到tcpAllowOthers参数了,如:

java -classpath h2.jar org.h2.tools.Server -tcp -tcpPort 9092 -tcpAllowOthers

数据库启动后,通过web console或JDBC连接时,需要把URL也更改为tcp方式,如:

jdbc:h2:tcp://localhost:9092/~/test

可以看到,在端口号后面追加绝对或相对路径和前面讲的文件方式启动时规则是一样的。

4)tcp方式启动(匿名ssl)

当使用tcp方式启动数据库时,如果需要从外网访问,就必须考虑安全问题,H2官网对SSL方式启动数据库做了非常精要的说明,如下:


Remote SSL/TLS connections are supported using the Java Secure Socket Extension (SSLServerSocket, SSLSocket). By default, anonymous SSL is enabled. The default cipher suite is SSL_DH_anon_WITH_RC4_128_MD5.

To use your own keystore, set the system properties javax.net.ssl.keyStore and javax.net.ssl.keyStorePassword before starting the H2 server and client. See also Customizing the Default Key and Trust Stores, Store Types, and Store Passwords for more information.

To disable anonymous SSL, set the system property h2.enableAnonymousSSL to false.


要使用ssl方式启动数据库,需要使用h2.enableAnonymousSSL和tcpSSL参数,如:

java -Dh2.enableAnonymousSSL=true -classpath h2.jar org.h2.tools.Server -tcp -tcpPort 9092 -tcpAllowOthers -tcpSSL

注意,前面的h2.enableAnonymousSSL需要设置到JAVA系统属性里,所以要在前面追加-D。由于默认使用的就是匿名SSL,所以h2.enableAnonymousSSL参数可以省略,也就是说,下面两个命令是等价的:

java -Dh2.enableAnonymousSSL=true -classpath h2.jar org.h2.tools.Server -tcp -tcpPort 9092 -tcpAllowOthers -tcpSSL
java -classpath h2.jar org.h2.tools.Server -tcp -tcpPort 9092 -tcpAllowOthers -tcpSSL

启动完毕,客户端连接的方式还和原来一样,不过要把url更改为ssl方式,如:

jdbc:h2:ssl://localhost:9092/~/test


5)tcp方式启动(ssl双向认证)

尽管匿名ssl方式启动数据库保证了数据传输的可靠与安全性,但仍然没有解决客户端及服务器身份问题。也就是说,通过上面的方式启动数据库后,任何一个人都可以通过其他机器连接至9092端口,只需要破解数据库密码即可随意操作你的数据库了,这无疑非常危险,所以我们需要更安全的方式。SSL双向认证的原理及细节这里就不再阐述了,我们主要讲解如何使用SSL双向认证的方式启动H2数据库。步骤如下:


  a)制作证书

  特别说明,以下制作证书的步骤我是参考http://www.blogjava.net/stone2083/archive/2007/12/20/169015.html上的。

  我们将使用jdk的keytool制作安全证书,请确保你的JDK已正确安装并且已经设置好环境变量。我的JDK安装在D:\soft\Java\jdk\jdk1.6.0_10目录下,为了简单,我直接在D:\soft\Java\jdk\jdk1.6.0_10\bin目录下运行相关命令,请依次运行:

(1)keytool -genkey -alias serverkey -keystore kserver.keystore

(2)keytool -export -alias serverkey -keystore kserver.keystore -file server.crt

(3)keytool -import -alias serverkey -file server.crt -keystore tclient.keystore


(4)keytool -genkey -alias clientkey -keystore kclient.keystore

(5)keytool -export -alias clientkey -keystore kclient.keystore -file client.crt

(6)keytool -import -alias clientkey -file client.crt -keystore tserver.keystore


为简单其见,凡是需要输入密码的地方都输入123456,凡是需要输入y和n的地方都输入y,这样命令执行成功后会生成以下文件

kserver.keystore

tserver.keystore

server.crt


kclient.keystore

tclient.keystore

client.crt

我们只需要其中的四个就行了,服务器需要使用kserver.keystore、tserver.keystore,客户端使用kclient.keystore、tclient.keystore。


  b)启动数据库

如果成功制作了安全证书,那么启动数据库就很简单了,只需要把上一步制作的kserver.keystore、tserver.keystore放在h2.jar同目录下(当然放在别的目录也可以,只要在参数上指定对的路径即可),启动命令如下:


java -Dh2.enableAnonymousSSL=false -Djavax.net.ssl.keyStore=kserver.keystore -Djavax.net.ssl.keyStorePassword=123456 -Djavax.net.ssl.trustStore=tserver.keystore -Djavax.net.ssl.trustStorePassword=123456 -classpath h2.jar org.h2.tools.Server -tcp -tcpPort 9092 -tcpAllowOthers -tcpSSL


  c)客户端连接

客户端连接时需要对应的kclient.keystore、tclient.keystore,放在h2.jar同一目录下即可,连接命令如下:

java -Djavax.net.ssl.keyStore=kclient.keystore -Djavax.net.ssl.keyStorePassword=123456 -Djavax.net.ssl.trustStore=tclient.keystore -Djavax.net.ssl.trustStorePassword=123456 -classpath h2.jar org.h2.tools.Console -web

如果你连接时出现Connection is broken [90067-72] 90067/90067 (Help)的错误,可能的原因有:

(1)未在启动参数中指明安全证书路径或指明的证书路径错误,或者忘了把证书放在指定的路径下

(2)启动参数中指明的密码错误

(3)连接的URL有误,比如忘了加ssl或者端口号指定错误等等

(4)连接的命令中忘了加-web参数,如果没有加-web,在本机测试时客户端也会占用9092端口,但它发现此端口已经被服务器占用了,就会启动失败,结果程序退出,这样的话IE虽然能打开,但是也会连接不上


3. h2的用户和schema

它同oracle和db2不同,sa可以认为是个实例用户,但与db2和oracle貌似不大一样,原因在于这个test的schame,用sa登陆test之后,可以建立用户,但并不要在上面直接建立schema,不是不能,可以建立,但建完的schema是属于test数据库下的,并不能真正可用,所以必须自行用建立好的用户登陆,这里直接登陆个没有的schema,h2会自动建立出来,然后在这个上面在建立schema。


————————————————

版权声明:本文为CSDN博主「zhoche2008」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhoche2008/article/details/7017767

帖子状态

话题参与者

回复显示排序:

给大家安利一款免费的在线流程图设计软件:贼好用 ProcessFlow — 免费在线作图、实时协作 ProcessFlow是一个在线作图工具的聚合平台, 它可以在线画流程图、思维导图、UI原型图、UML、网络拓扑图、组织结构图等等, 您无需担心下载和更新的问题, 不管Mac还是Windows,一个浏览器就可以随时随地的发挥创意,规划工作,解放您的双手,让您腾出双手去成就别人的梦想。

Finally!
有没有特别的设计建议或更新的指南?
Finally!
您好,这边没有的。
tesla02 best answer
6 Jan,2019
Finally!
有没有特别的设计建议或更新的指南?
此帖子已被版主标记,收到太多否决票。

这是太大的预览图像,它应该更小,甚至五行。在一个页面上有30到60个页面,它是1800个项目 类别例如在附加组件类别有22749个项目,为什么不看到所有的项目,但只有那1800个项目?这是件坏事。

看起来您是个新人,欢迎免费注册社区,加入我们的大家庭,一起学习,一起成长。
提交你的评论
System.out.println("请输入你的代码块...");
话题
分类
喜欢
回复
浏览
活跃
原创社区
985
0
1.5k
原创社区
985
1
1.5k
20/12/25 22:32:21
javaWeb
985
1
1.5k
20/06/15 22:09:21
youtube
698
78
2.1k
3d
Settings

请插入代码块