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下,并加入工程引用。

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内存数据库 支持存储到文件

时间: 2024-11-07 09:28:58

H2内存数据库 支持存储到文件的相关文章

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环境变量) htt

七牛云存储还有一个独一无二的特性——支持用户将文件从客户端直传到云服务器中

目前七牛已经拥有数千家客户,你会发现其中有很多都是像知乎.Weico.Camera360.美图秀秀.蝉游记和Vida等UGC(用户产生内容)类产品,尤其是在图片社交领域.这是因为,除了我在前面所说的“云存储”比传统方案更节省成本外,七牛云存储还有一个独一无二的特性——支持用户将文件从客户端直传到云服务器中.因为我看过蝉游记CTO Quake撰文写过这一特性,所以就直接引用他的原文来做说明: 常见的云存储上传文件流程一般如下: 用户 =>应用服务器 =>云存储提供商 这样多了一次上传的流程,和本

Android_存储之文件存储

前面几篇随笔 讲到的关于存储的,SharedPreferences.Room.数据库等 最终都是以文件形式 存储到手机上的(除特殊的存储于手机内存的:如Room可以创建内存数据库). 这些存储方式,Android都提供了相应的API 方便操作数据: SharedPreferences:最终存储为一个xml文件. 数据库:以数据库的形式存储,在手机中是一个.db的文件.前面有讲过两种 一种是Room,一种是ContentProvider. 下面,详细的介绍下在Android 直接读写文件. 一.内

云存储:文件的上传

大型网站架构:降低主站服务器的压力 CDN:智能DNS挑选最近的服务器提供图片等 云存储:把图片放到单独的服务器,价格低 云存储:七牛.AWS.又拍云.盛大云.阿里云.百度云 云计算:租.按需使用.按需付费 又拍云:帐号注册--操作空间 上传: ftp:// 登录 http:// 下载SDK 问题:把上传的文件不存在当前应用程序某个文件夹下,而是直接存到云存储,并返回一个云服务器的路径 ---??? 步骤:注册-ftp上传-http上传(下载SDK-demo示例)-保存到云上.返回云路径 pub

如果写一个android支持的html文件

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/199

磁盘工作原理、文件系统及i节点、块存储、文件存储、对象存储、DAS、NAS、还有SAN

(一)磁盘工作原理 一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标.型号.序列号.生产日期.容量.参数和主从设置方法等.这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义. 硬盘主要由盘体.控制电路板和接口部件等组成,如图1-1所示.盘体是一个密封的腔体.硬盘的内部结构通常是指盘体的内部结构:控制电路板上主要有 硬盘BIOS.硬盘缓存(即CACHE)和主控制芯片等单元,如图1-2所示:硬盘接口包括电源插座.数据接口和主.从跳线,如图1-3所示. 图1-1 硬盘的外观 图1-

块存储、文件存储和对象存储

一.块存储 典型设备:磁盘阵列,硬盘 块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘.做Raid.或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘.(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了.例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘.) 接着块

对象存储与块存储、文件存储等对比

看到 一篇文档, 讲 对象存储, 好奇,搜索文章,摘抄,学习记录 ! 背景: 传统存储在面对海量非结构化数据时,在存储.分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设计或优化.成本过高.并非PB级的扩展.不支持永远在线.专有的一体机设备等等,非结构化数据以每年60%-80%的速率增长,从而可扩展性变成了最迫切的需求. 传统存储在面对海量非结构化数据时,在存储.分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设计或优化.成本过高.并非

块存储、文件存储、对象存储意义及差异

关于块存储.文件存储.对象存储方面的知识在知乎上看到了个很好的解答:https://www.zhihu.com/question/21536660 通俗易懂,查了些资料做了详细的补充. 块存储 典型设备:磁盘阵列.硬盘 块存储主要是将裸磁盘空间整个映射给主机使用的. 就是说例如:磁盘阵列里面有5块硬盘,然后可以通过划逻辑盘.做Raid.或者LVM等方式逻辑划分出N个逻辑的硬盘.但是逻辑盘和物理盘是两个完全不同的概念.假设每个硬盘100G,共有5个硬盘,划分为逻辑盘也为5个,每个100G,但是这5