H2数据库使⽤详解
H2最完整的资料下载地址:
H2数据库使⽤
H2数据库介绍
常⽤的开源数据库:H2,Derby,HSQLDB,MySQL,PostgreSQL。其中H2,HSQLDB类似,⼗分适合作为嵌⼊式数据库使⽤,其它的数据库⼤部分都需要安装独⽴的客户端和服务器端。
H2的优势:
1、h2采⽤纯Java编写,因此不受平台的限制。
2、h2只有⼀个jar⽂件,⼗分适合作为嵌⼊式数据库试⽤。
3、性能和功能的优势
H2⽐HSQLDB的最⼤的优势就是h2提供了⼀个⼗分⽅便的web控制台⽤于操作和管理数据库内容,这点⽐起HSQLDB的swing和awt控制台实在好⽤多了。
H2和各数据库特征⽐较。
准备⼯作
3、点击 connect ,登录。
4、执⾏上图中红⾊部分sql语句,成功创建test表。
因为没有指定数据库⽂件位置,会⾃动输出到输出到C:\Users\Administrator下。
H2⽂件结构
%H2_HOME%
-h2
-bin
h2-1.3.154.jar //jar包
h2.bat //Windows控制台启动脚本
h2.sh //Linux控制台启动脚本
drop table if exists adminh2w.bat //Windows控制台启动脚本(不带⿊屏窗⼝)
+docs 帮助⽂档
+service //通过wrapper包装成服务。
+src //源代码
build.bat windows构建脚本
build.sh linux构建脚本
H2的使⽤
⽀持Embedded,server和in-memory模式以及内存模式。
Embedded模式
1、新建java project⼯程 H2Test。
2、%H2_HOME%\bin\h2-1.3.154.jar 复制到 \H2Test\lib下,并加⼊⼯程引⽤。
3、新建Generic H2 (Embedded)数据库,指定:JDBC ,然后执⾏上⾯的test sql语句,来创建⼀个test表。
4、新建 TestH2类主要代码
public static void main(String[] a)
throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:E:\\research\\workspace\\H2Test\\db\\test", "sa", "");
// add application code here
Statement stmt = ateStatement();
ResultSet rs = uteQuery("SELECT * FROM TEST ");
()) {
System.out.Int("ID")+","+rs.getString("NAME"));
}
conn.close();
}
控制台打印出:1,Hi
server模式
1、直接将jdbc url 改为:jdbc:h2:tcp://localhost/~/test 就⾏了。因为我们在上⾯第⼀步的时候已经在C:\Users\Administrator创建了test数据库。
你也可以再创建新的数据库,默认都是保存在C:\Users\Administrator下的。
注意:你必须启动服务:%H2_HOME%\bin\h2.bat 或者以服务模式启动:%H2_HOME%\service\0_run_server_debug.bat ,⾥⾯有好⼏个脚本把H2部署为服务模式。每次机器
启动后⾃动启动H2服务。
2、新建 TestServerH2类主要代码
public static void main(String[] a)
throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "");
// add application code here
Statement stmt = ateStatement();
ResultSet rs = uteQuery("SELECT * FROM TEST ");
()) {
System.out.Int("ID")+","+rs.getString("NAME"));
}
conn.close();
}
运⾏的结果和上⾯⼀样。
内存模式(数据只保存在内存中)
1、新建 TestMemH2类主要代码
public static void main(String[] a)
throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:tcp://localhost/mem:test2", "sa", "");
// add application code here
Statement stmt = ateStatement();
ResultSet rs = uteQuery("SELECT * FROM TEST_MEM");
()) {
System.out.Int("ID")+","+rs.getString("NAME"));
}
conn.close();
}
控制台打印出:1,Hello_Mem
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
集 / ⾼可⽤性
数据库⽀持简单的集/⾼可⽤性机制。架构是:两个数据库服务运⾏在两台不同的计算机上,两台计算机有同样数据库的副本,如果两个服务器都处于运⾏状态,每个数据库操作都被在两台计算机上执⾏,如果⼀台服务器宕机(断电、硬件故障、⽹络故障等),另外⼀台计算机仍能提供服务,从这⼀刻开始,数据库操作仅在⼀台服务器上执⾏,直到另外⼀台服务器恢复运⾏。
集仅能⽤于服务器模式(内嵌模式并不⽀持集)。可以在数据库运⾏状态下恢复集,但是要求在第⼆个数据库恢复期间没有应⽤在改变第⼀个数据库的数据,因此恢复集是⼀个⼿⼯的过程。
初始化集,使⽤下⾯的步骤:
· 创建数据库
· 使⽤CreateCluster⼯具创建⼀个数据库福分到另外的地⽅,并且初始化集,这样就得到了同样数据的两个数据库
· 启动两个数据库服务(每个数据库的副本)
· 现在可以通过应⽤客户端连接到数据库
使⽤创建集⼯具
要了解集如何⼯作,请尝试下⾯的例⼦,在这个例⼦⾥,两个数据库驻留在同⼀台计算机上,但通常,两个数据库在不同的计算机上。· 创建两个⽬录:server1,server2。每个⽬录将模拟⼀台计算机
· 在第⼀个⽬录启动TCP服务,你可以运⾏下⾯的命令:
· java ls.Server
· -tcp-tcpPort 9101
· -baseDirserver1
· 在第⼆个⽬录启动TCP服务,模拟第⼆个服务器(冗余运⾏),你能使⽤下⾯的命令:
· java ls.Server
· -tcp-tcpPort 9102
· -baseDirserver2
· 使⽤ CreateCluster ⼯具初始化集,如果数据库不存在,将创建⼀个新的空数据库,运⾏下⾯命令⾏:
· java ls.CreateCluster
· -urlSourcejdbc:h2:tcp://localhost:9101/~/test
· -urlTargetjdbc:h2:tcp://localhost:9102/~/test
· -user sa
· -serverList localhost:9101,localhost:9102
· 应⽤或者是H2控制台可以通过下⾯的JDBC的URL连接数据库:jdbc:h2:tcp://localhost:9101,localhost:9102/~/test
· 如果你停⽌⼀个服务(通过杀进程),你注意到另⼀个机器继续⼯作,数据库仍能提供访问。
· 恢复集,你需要先删掉宕机的数据库,然后重启宕机的数据库的服务,再重新运⾏CreateCluster集⼯具。
检测运⾏状态下的集
查哪些节点当前正在运⾏,通过执⾏下⾯的SQL语句:
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERENAME='CLUSTER'
结果返回为 '' (两个单引号),说明集模式被屏蔽,否则,集服务器列表将被单引号包括着返回,如'server1:9191,server2:9191'。
2、上⾯的 URL 改为 jdbc:h2:~/mem:test 也是可以的。如果是localhost必须启动服务。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
数据库连接 URL说明
数据库⽀持多种连接模式和连接设置,不同的连接模式和连接设置是通过不同的URL来区分的,URL中的设置是不区分⼤⼩写。
Topic URL Format and Examples
jdbc:h2:[file:][<path>]<databaseName>
jdbc:h2:~/test
jdbc:h2:file:/data/sample
jdbc:h2:file:C:/data/sample (Windows only)
jdbc:h2:mem:
jdbc:h2:mem:<databaseName>
jdbc:h2:mem:test_mem
TCP/I jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
jdbc:h2:tcp://localhost/~/test
jdbc:h2:tcp://dbserv:8084/~/sample
jdbc:h2:ssl://<server>[:<port>]/<databaseName>
jdbc:h2:ssl://secureserv:8085/~/sample;
jdbc:h2:<url>;CIPHER=[AES|XTEA]
jdbc:h2:ssl://secureserv/~/testdb;CIPHER=AES
jdbc:h2:file:~/secure;CIPHER=XTEA
jdbc:h2:<url>;FILE_LOCK={NO|FILE|SOCKET}
jdbc:h2:file:~/quickAndDirty;FILE_LOCK=NO
jdbc:h2:file:~/private;CIPHER=XTEA;FILE_LOCK=SOCKET
jdbc:h2:<url>;IFEXISTS=TRUE
jdbc:h2:file:~/sample;IFEXISTS=TRUE
jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE
jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>]
jdbc:h2:file:~/sample;USER=sa;PASSWORD=123
jdbc:h2:<url>;LOG=2
jdbc:h2:file:~/sample;LOG=2
jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3>
jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3
jdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE
jdbc:h2:<url>;ACCESS_MODE_LOG=rws;ACCESS_MODE_DATA=rws
Zip⽂件中的数据库jdbc:h2:zip:<zipFileName>!/<databaseName>
jdbc:h2:zip:~/db.zip!/test
jdbc:h2:<url>;MODE=<databaseType>
jdbc:h2:~/test;MODE=MYSQL
jdbc:h2:<url>;AUTO_RECONNECT=TRUE
jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE
jdbc:h2:<url>;AUTO_SERVER=TRUE
jdbc:h2:~/test;AUTO_SERVER=TRUE
jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...]
jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3
使⽤笔记:
h2数据库使⽤加密连接
Class.forName("org.h2.Driver");
String url = "jdbc:h2:~/test;CIPHER=AES";
String user = "sa";
//密码由2部分组成,⽂件密码和连接密码,⽤空格隔开
String pwds = "filepwd userpwd";
conn = DriverManager.
getConnection(url, user, pwds);
连接字符串参数
1.DB_CLOSE_DELAY:要求最后⼀个正在连接的连接断开后,不要关闭数据库
2.MODE=MySQL:兼容模式,H2兼容多种数据库,该值可以为:DB2、Derby、HSQLDB、MSSQLServer、MySQL、Oracle、PostgreSQL
3.AUTO_RECONNECT=TRUE:连接丢失后⾃动重新连接
4.AUTO_SERVER=TRUE:启动⾃动混合模式,允许开启多个连接,该参数不⽀持在内存中运⾏模式
5.TRACE_LEVEL_SYSTEM_OUT、TRACE_LEVEL_FILE:输出跟踪⽇志到控制台或⽂件,取值0为OFF,1为ERROR(默认值),2为INFO,3为DEBUG
6.SET TRACE_MAX_FILE_SIZE mb:设置跟踪⽇志⽂件的⼤⼩,默认为16M
数据库操作[]内的内容可不填
如下的操作都可以在h2的help表中到
修改数据库密码
//sa 为⽤户名 'nms'为修改的密码(可以'')
ALTER USER sa SET { PASSWORD 'nms' }
创建⽤户
//bob为⽤户名 'x'为密码(可以'') CREATE USER IF NOT EXISTS bob { PASSWORD 'x' }
删除⽤户
//bob为⽤户名
DROP USER [IF EXISTS] bob
修改⽤户权限
ALTER USER bob ADMIN { TRUE }重命名⽤户
//把bob重命名为json
ALTER USER bob RENAME TO json
官⽅⽂档:
相关⽂章
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论