H2最完整的资料下载地址:

http://download.csdn.net/detail/yixiaoping/5956595

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和各数据库特征比较。

准备工作

1、h2-2011-04-04.zip  下载地址:http://www.h2database.com/html/download.html
2、解压文件,这里以%H2_HOME%表示为解压的文件目录。运行%H2_HOME%\bin\h2.bat 将会自动打开下面网址。(请确认是否安装了jdk,并设置了JAVA_HOME环境变量)
http://192.168.140.1: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下,并加入工程引用。
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();
 }

控制台打印出: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 = 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

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

集群 / 高可用性

数据库支持简单的集群/高可用性机制。架构是:两个数据库服务运行在两台不同的计算机上,两台计算机有同样数据库的副本,如果两个服务器都处于运行状态,每个数据库操作都被在两台计算机上执行,如果一台服务器宕机(断电、硬件故障、网络故障等),另外一台计算机仍能提供服务,从这一刻开始,数据库操作仅在一台服务器上执行,直到另外一台服务器恢复运行。

集群仅能用于服务器模式(内嵌模式并不支持集群)。可以在数据库运行状态下恢复集群,但是要求在第二个数据库恢复期间没有应用在改变第一个数据库的数据,因此恢复集群是一个手工的过程。

初始化集群,使用下面的步骤:

·        创建数据库

·        使用CreateCluster工具创建一个数据库福分到另外的地方,并且初始化集群,这样就得到了同样数据的两个数据库

·        启动两个数据库服务(每个数据库的副本)

·        现在可以通过应用客户端连接到数据库

使用创建集群工具

要了解集群如何工作,请尝试下面的例子,在这个例子里,两个数据库驻留在同一台计算机上,但通常,两个数据库在不同的计算机上。

·        创建两个目录:server1,server2。每个目录将模拟一台计算机

·        在第一个目录启动TCP服务,你可以运行下面的命令:

·        java org.h2.tools.Server

·            -tcp-tcpPort 9101

·            -baseDirserver1

·        在第二个目录启动TCP服务,模拟第二个服务器(冗余运行),你能使用下面的命令:

·        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:~/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/IP的服务器模式(远程连接)

jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
jdbc:h2:tcp://localhost/~/test
jdbc:h2:tcp://dbserv:8084/~/sample

使用SSL/TLS的服务器模式(远程连接)

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
相关文章

H2数据库使用 详解的更多相关文章

  1. SAE上传web应用(包括使用数据库)教程详解及问题解惑

    转自:http://blog.csdn.net/baiyuliang2013/article/details/24725995 SAE上传web应用(包括使用数据库)教程详解及问题解惑: 最近由于工作 ...

  2. windows phone 8.1开发SQlite数据库操作详解

    原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...

  3. MySQL数据库优化详解(收藏)

    MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * ...

  4. 如何查看mysql数据库的引擎/MySQL数据库引擎详解

    一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mys ...

  5. MySQL数据库备份详解

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  6. ORACLE数据库备份与恢复详解

    ORACLE数据库备份与恢复详解 学习过程中的总结,有兴趣不妨看看,如果有不对的地方,高手不要留情!! Oracle的备份与恢复有三种标准的模式,大致分为两 大类,备份恢复(物理上的)以及导入导出(逻 ...

  7. MySQL(二) 数据库数据类型详解

    序言 今天去健身了,感觉把身体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这里讲清楚了,以后在看到什么数据类型,咱度应该认识,对我来说,最不熟悉的应该就是时间类型这块了.但是通过 ...

  8. android 数据库操作详解

    请看郭大神的八篇专栏,包含sql语句  android封装的databasehelper 和郭大神自己的LitePal  三种使用详解 http://blog.csdn.net/column/deta ...

  9. hsql数据库使用详解(入门)及快速使用

    一.简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,不凡考虑一下使用它,相对其 他数据库来说,其体积小,才563kb.仅一个hsq ...

随机推荐

  1. cmder中文显示相关问题解决方案(1.3以上版本)

    cmder虽然Windows命令行的进阶版,虽然好看易用,但其中文编码一直是个问题.网上有不少博客给出解决方案,大部分都已因为版本更新失效.本文解决方案针对1.3以上版本的cmder用户 中文字体重叠 ...

  2. [转载]FFmpeg完美入门[3] - FFmpeg功能及使用说明

    1 ffplay对多媒体的支持能力验证 一.视频3gp 177X144 支持播放,在windows下播放正常,但是在linux下面偶有BUG 如果发现画面无法显示而声音可以播放的情况下可以试着切换全屏 ...

  3. 详述Linux配置静态IP、设置DNS和主机名(一)

    Linux配置静态IP.设置DNS和主机名首先要找到配置文件,这是在Linux系统下进行工作的必须知道工作方式.后面一步步的跟着这个范例来进行配置相信你最终也会完成Linux配置静态IP.设置DNS和 ...

  4. requests 介绍

    一.  requests 参数 - method: 提交方式 - url: 提交地址 - params: 在URL中传递的参数,GET - data: 在请求体里传递的数据 - json 在请求体里传 ...

  5. python_异常处理

    常用异常种类 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块 ...

  6. [BZOJ4945][Noi2017]游戏 2-sat

    对于所有的x,我们枚举他的地图类型,事实上我们只需要枚举前两种地形就可以覆盖所有的情况. 之后就变成了裸的2-sat问题. 对于一个限制,我们分类讨论: 1.h[u]不可选,跳过 2.h[v]不可选, ...

  7. python开发学习-day09(队列、多路IO阻塞、堡垒机模块、mysql操作模块)

    s12-20160312-day09 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  8. thinkphp5.0 API友好

    新版ThinkPHP针对API开发做了很多的优化,并且不依赖原来的API模式扩展. 数据输出 新版的控制器输出采用Response类统一处理,而不是直接在控制器中进行输出,通过设置default_re ...

  9. Python序列化模块-Pickel写入和读取文件

    利用pickle 存储和读取文件 1.存储文件: #引入所需包,将列表元素存入data2的文件里面 import pickle mylist2 ={'1','nihao','之后','我们',1,2, ...

  10. 编写WPF程序,完成弹框打印和直接打印

    弹框打印 PrintDialog pd = new PrintDialog(); pd.ShowDialog(); //↓第一个参数是StackPanel控件里面放一个label放打印的文字 pd.P ...