当前位置: 首页 > news >正文

h2db新手入门篇——概念及初步使用

一、什么是内存数据库(认识内存数据库)

在了解h2db之前,我们先了解一下内存数据库。见名知其意,内存数据库就是将数据存储到内存中的数据库,与此不同的是传统数据库将数据存储到磁盘中,因此内存数据库的最大优势就是读写速度极快,一般是传统数据库的10-1000倍。正是由于对数据的存储和操作都是直接在内存中进行的,所以断电后数据将会丢失;内存数据库主要用作数据缓存和内存计算,而不能解决数据持久化存储的问题。目前主流的内存数据库主要有以下三类:
  1. 关系型内存数据库:作为传统数据库应用层数据的缓存,支持sql语句访问数据库中的数据,提供有限的事务保证,例如h2db;
  2. 键值对内存数据库:键值对存储结果,按key进行读取,value支持各种数据类型,比如redis;
  3. 传统数据库的内核引擎:在数据库层面提供了数据库引擎机制,最大程度减少磁盘IO;支持事务和数据持久化保证,但对数据类型有限制,例如:MySQL Memory Engine;

二、认识h2db

h2db是纯Java编写的内存数据库,是一个开源项目,其源码都打包在jar文件中,目前稳定的最新版本h2-1.4.196.jar也只有1.8M左右。h2db 有两种工作方式:嵌入式模式和服务器模式。
  • 嵌入式运行模式:数据库作为整个应用的一部分,数据库server和应用运行在一个进程中;应用结束时,h2db server也会关闭。
  • 服务器运行模式:数据库server运行在独立的进程中,应用通过连接和数据库server建立联系。该模式下又有三种连接方式,分别是web server模式、TCP server模式,PG server模式(PostgreSQL clients),在启动h2db服务时通过参数指定工作模式。
java -cp h2*.jar org.h2.tools.Server -tcp //启动一个tcp服务,另外两种模式为-web,-pg。
    • -web模式启动后,可以通过浏览器连接H2 console控制台,这样就能使用浏览器来管理数据库,非常方便,默认监听端口为8082,可以通过参数(-webPort <port>)指定端口,数据库运行后,在浏览器中输入地址 localhost:8082连接到数据库。
    • -pg模式启动后,可以使用PostgreSQL clients连接到数据库进行管理。
    • -tcp模式启动后,应用可以通过jdbc或odbc相关接口连接到数据库。是最常用的方式。
  • 由于在服务器模式下,数据要通过TCP/IP相关协议完成传输,所以工作效率可能低于嵌入模式。这两种模式还可以混合使用,即工作在嵌入式模式下的h2db允许其他应用连接,这样就是一种混合模式了。无论在哪种模式下,h2db都支持都支持持久(persistence)和内存临时数据库(in-memory)。
嵌入式模式
服务器模式

混合模式

三、如何使用h2db

1、下载、安装与启动

  • 直接在官网http://www.h2database.com/html/download.html下载zip文件后解压,得到下面的目录结构。
文件目录
说明
bin
JAR 和批处理文件
docs
文档
docs/html
HTML 页面
docs/javadoc
Javadoc 文件
ext
外部依赖 (构建时下载的)
service
运行数据库作为 Windows 的 Service
src
源文件
src/docsrc
文档源文件
src/installer
安装程序,shell和发布的构建脚本
src/main
数据库引擎源代码
src/test
测试源代码
src/tools
工作和数据库适配器源代码
嵌入式模式下时可以直接将bin下的jar文件拷贝到应用的classpath下即可,当然也可以通过maven等管理工具直接从相关仓库中下载依赖。在程序中完成启动,参数指定启动模式和监听端口,这时h2db server和应用程序运行在同一个进程。应用程序结束时,h2db server也会结束运行:
Server server = Server.createTcpServer( new String[] { "-tcp", "-tcpAllowOthers", "-tcpPort", "9092" }).start();复制代码
服务器模式下工作时可以通过命令启动h2db server:切换到jar文件夹所在的目录下(bin目录),然后使用Java命令运行jar文件: java -cp h2*.jar org.h2.tools.Server -参数,通过参数指定运行模式和监听端口。

2、连接到数据库

  • 运行在web server模式下时,直接在浏览器中键入URL进行连接:
  • 连接成功后进入管理页面,可以通过执行sql进行具体的表操作。
  • tcp server模式下可以通过jdbc或者ODBC的api连接数据库;
String url = "jdbc:h2:tcp://localhost/mem:test;DB_CLOSE_DELAY=-1";Class.forName("org.h2.Driver");  //必须要保证工程中加入了h2*.jar包Connection conn = DriverManager.        getConnection(url,"sa", "");复制代码
url中指定了要连接的数据库的路径,如果数据库(本例中是test)不存在时,默认新建一个数据库,可以url中添加;IFEXISTS=TRUE设置为只有数据库存在时才建立连接。mem指定该连接是in-momory方式(注:这种做法有点不好理解,一般情况都是在server启动时指定运行方式;个人觉得之所以在连接时指定数据库是以persistence还是in-memory方式运行,是因为一个h2db server可以同时按着两种方式工作,具体怎么选择,交给具体的应用在连接时决定)。由于在最后一个连接断开时,h2db会默认关闭,如果在in-memory方式下运行,数据库中的数据就会全部丢失,这是一件比较危险的事情,通过在url中添加DB_CLOSE_DELAY=-1来避免这种情况,这样在应用程序和h2db server运行在不同的进程中时应用程序因为某些原因出错而与数据库断开连接时,保证数据不丢失。
  • 不同模式下,连接所用的URL不同,具体见下表:
运行模式
url格式
嵌入式模式
jdbc:h2:~/test
In-memory (private):私有连接,此时一个数据库只能有一个连接,在一个虚拟机中打开多个连接时会导致打开多个私有数据库。
jdbc:h2:mem:
In-memory (named):运行多个应用连接到数据库
jdbc:h2:mem:<databaseName>
jdbc:h2:mem:test_mem
TCP server模式
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:tcp://localhost/~/test jdbc:h2:tcp://dbserv:8084/~/sample jdbc:h2:tcp://localhost/mem:test
TLS server 模式
jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:ssl://localhost:8085/~/sample;

3、对数据库的操作

通过jdbc执行DDL,DML,DQL语句完成对数据库的各种操作。对于大对象数据(BLOB/CLOB、BINARY/VARBINARY)的存取更新,使用PrepareStatement完成存储和更新。
String sql = "intsert int test (col1,col2) values('t1',?)";
byte[] data = new byte[1024];
PreparedStatement ps = con.prepareStatement(sql);
ps.setBytes(1,data);
ps.executeUpdate();
...
ps.close();
复制代码


相关文章:

  • Android 布局巧用之include、merge、ViewStub
  • HTML(form标签)、CSS选择器一
  • 初始 Mybatis(一) —— 基本配置及用法
  • OpenStack Newton部署官方指南
  • 小前端眼里的大前端:GMTC 2018 参会小结
  • Rails哲学三原则
  • TCPDF 如何实现首行缩进
  • https请求过程
  • 一个JS多个数组取交集算法
  • JS对象的克隆
  • 作为面试官如何从深度和广度上考察面试者
  • 沃森想通过社交网络筛出最想要优惠券的人
  • 刨根问底 | Elasticsearch 5.X集群多节点角色配置深入详解【转】
  • 在word中输入任意角度旋转图片
  • python怎么写可读性好的面向过程的长篇代码?
  • JavaScript-如何实现克隆(clone)函数
  • 2019.2.20 c++ 知识梳理
  • Angular 2 DI - IoC DI - 1
  • Bootstrap JS插件Alert源码分析
  • CODING 缺陷管理功能正式开始公测
  • create-react-app项目添加less配置
  • CSS中外联样式表代表的含义
  • input的行数自动增减
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Linux gpio口使用方法
  • MySQL的数据类型
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 猴子数据域名防封接口降低小说被封的风险
  • 来,膜拜下android roadmap,强大的执行力
  • 前端存储 - localStorage
  • 如何实现 font-size 的响应式
  • 主流的CSS水平和垂直居中技术大全
  • zabbix3.2监控linux磁盘IO
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 容器镜像
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (二开)Flink 修改源码拓展 SQL 语法
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三) diretfbrc详解
  • (四)模仿学习-完成后台管理页面查询
  • (转)nsfocus-绿盟科技笔试题目
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .form文件_一篇文章学会文件上传
  • .gitignore文件---让git自动忽略指定文件
  • .Net 6.0 处理跨域的方式
  • .Net mvc总结
  • .NET中GET与SET的用法
  • .NET中使用Redis (二)
  • .sys文件乱码_python vscode输出乱码
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /*在DataTable中更新、删除数据*/