H2内存数据库 支持存储到文件
准备工作
1、下载JDK(本人下载的版本号为JDK1.7)、环境变量设置JAVA_HOME。设置PATH(%JAVA_HOME%\bin%)。
2、下载并解压:h2-2014-07-13.zip 官网下载地址:http://www.h2database.com/html/main.html
3、环境变量设置H2_HOME。
%H2_HOME%表示为解压的文件文件夹。执行%H2_HOME%\bin\h2.bat 将会自己主动打开以下网址。
(请确认是否安装了jdk,并设置了JAVA_HOME环境变量)
http://localhost:8082/login.jsp?jsessionid=244e36a683f97f0d4f3b000f33530ed1
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控制台启动脚本
h2w.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下。并增加project引用。
3、新建Generic H2 (Embedded)数据库。指定:JDBC URL:jdbc:h2:E:\research\workspace\H2Test\db\test。然后运行上面的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 = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST ");
while(rs.next()) {
System.out.println(rs.getInt("ID")+","+rs.getString("NAME"));
}
conn.close();
}
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 = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST ");
while(rs.next()) {
System.out.println(rs.getInt("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 = conn.createStatement();
stmt.executeUpdate("CREATE TABLE TEST_MEM(ID INT PRIMARY KEY,NAME VARCHAR(255));");
stmt.executeUpdate("INSERT INTO TEST_MEM VALUES(1, 'Hello_Mem');");
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_MEM");
while(rs.next()) {
System.out.println(rs.getInt("ID")+","+rs.getString("NAME"));
}
conn.close();
}
控制台打印出:1,Hello_Mem
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
集群 / 高可用性
数据库支持简单的集群/高可用性机制。架构是:两个数据库服务执行在两台不同的计算机上,两台计算机有相同数据库的副本,假设两个server都处于执行状态,每一个数据库操作都被在两台计算机上执行,假设一台server宕机(断电、硬件故障、网络故障等),另外一台计算机仍能提供服务,从这一刻開始,数据库操作仅在一台server上执行,直到另外一台server恢复执行。
集群仅能用于server模式(内嵌模式并不支持集群)。能够在数据库执行状态下恢复集群。可是要求在第二个数据库恢复期间没有应用在改变第一个数据库的数据,因此恢复集群是一个手工的过程。
初始化集群,使用以下的步骤:
· 创建数据库
· 使用CreateCluster工具创建一个数据库福分到另外的地方,而且初始化集群,这样就得到了相同数据的两个数据库
· 启动两个数据库服务(每一个数据库的副本)
· 如今能够通过应用client连接到数据库
使用创建集群工具
要了解集群怎样工作,请尝试以下的样例,在这个样例里,两个数据库驻留在同一台计算机上,但通常,两个数据库在不同的计算机上。
· 创建两个文件夹:server1,server2。
每一个文件夹将模拟一台计算机
· 在第一个文件夹启动TCP服务。你能够执行以下的命令:
· java org.h2.tools.Server
· -tcp-tcpPort 9101
· -baseDirserver1
· 在第二个文件夹启动TCP服务,模拟第二个server(冗余执行),你能使用以下的命令:
· java org.h2.tools.Server
· -tcp-tcpPort 9102
· -baseDirserver2
· 使用 CreateCluster 工具初始化集群,假设数据库不存在。将创建一个新的空数据库。执行以下命令行:
· java org.h2.tools.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:mem: |
|
jdbc:h2:mem:<databaseName> |
|
使用TCP/IP的服务器模式(远程连接)
|
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> |
|
jdbc:h2:ssl://<server>[:<port>]/<databaseName> |
jdbc:h2:<url>;CIPHER=[AES|XTEA] |
|
jdbc:h2:<url>;FILE_LOCK={NO|FILE|SOCKET} |
|
jdbc:h2:<url>;IFEXISTS=TRUE |
|
jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE |
|
jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>] |
|
jdbc:h2:<url>;LOG=2 |
|
jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..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:<url>;MODE=<databaseType> |
|
jdbc:h2:<url>;AUTO_RECONNECT=TRUE |
|
jdbc:h2:<url>;AUTO_SERVER=TRUE |
|
jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...] |