h2 数据库命令行工具用法汇总

背景

h2 数据是个短小精悍的嵌入式数据库,纯 Java 实现,且非常小。

我们有一个比较底层的应用中就是用了 h2 数据库来存储应用的基础信息,这个数据库说起来比较容易。

本文总结实际项目中涉及到的 h2 的相关技术及问题。

控制台工具用法

网络策略比较严格的环境下,h2 没有开启对外的浏览器访问工具时,怎么连接 h2 数据库进行数据操作呢?

h2 数据库提供了命令行工具类 org.h2.tools.Shell,可以用它连接数据库进行操作,使用方法为:

java -cp h2*.jar org.h2.tools.Shell

命令输出要求你输入连接 需要的配置信息:

Welcome to H2 Shell xxx (xxx)
Exit with Ctrl+C
[Enter]   jdbc:h2:tcp://XXX:xxx///xxx/dt
URL       
[Enter]   org.h2.Driver
Driver    org.h2.Driver
[Enter]   sa
User      
[Enter]   Hide
Password

按要求输入h2连接目标数据库的信息后,就可以操作数据库了。
在这里插入图片描述

未授权漏洞封堵

h2 数据库的的 console 浏览器访问工具,它有两种比较危险的未授权漏洞:

  1. 默认创建不存在的数据库
  2. Preferences 未授权问题

H2 Database Console未授权访问

H2 Database Console未授权访问,默认情况下自动创建不存在的数据库,从而导致未授权访问。启动参数添加 -ifExists ,它的含义:

[-ifExists] Only existing databases may be opened (all servers)

应用出厂时先创建好数据库文件后,修改启动脚本,添加该参数:

dir=$(dirname "$0")
nohup java -cp "$dir/h2-2.x.xx.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Server -tcpAllowOthers -webAllowOthers -tcpPort -ifExists "$@" &

这样启动 h2 后首次访问时会因为 test 数据库不存在而无法连接:
在这里插入图片描述
只有输入正确的出厂数据库路径、帐号和密码,才能连接到数据库操作页面。

Preferences 未授权问题

上面只能封堵针对数据库操作的未授权访问,未登录时 Preferences 这个操作页面的 “shutdown” 按钮可以直接将 h2 服务停止,比前面的未授权更严重
在这里插入图片描述

解决办法是升级到 2.x 版本,它自带了控制台管理员密码 webAdminPassord 配置,必须输入密码才能进入可选项配置页面。

在这里插入图片描述

数据导入导出工具

在有些情况下需要用到数据库的导入导出文件,比如应用老版本的数据库 A 和新版本的数据库 B 直接升级补丁语句跨度过多,升级操作比数据迁移更复杂时,对于数据库中表结构一致的表,可以使用 h2 的导入工具「INSERT INTO xxx SELECT * FROM CSVREAD」 和导出工具「call CSVWRITE」来完成。

第一步,从旧数据库中整理需要导出的表,然后使用导出工具编写导出脚本:

call CSVWRITE ('/mydata/table_a.csv', 'SELECT * FROM table_a');
call CSVWRITE ('/mydata/table_b.csv', 'SELECT * FROM table_b');
call CSVWRITE ('/mydata/table_c.csv', 'SELECT * FROM table_c');

第二步,连接旧数据库,执行导出脚本,注意导出脚本执行后会导出到客户端所在的机器上。比如,用浏览器连接,就在本机;用工具连接,就在目标服务器上。
在这里插入图片描述

第三步,连接新数据库,使用导入工具编辑导入脚本:

INSERT INTO table_a SELECT * FROM CSVREAD('/mydata/table_a.csv');
INSERT INTO table_b SELECT * FROM CSVREAD('/mydata/table_b.csv');
INSERT INTO table_c SELECT * FROM CSVREAD('/mydata/table_c.csv');
commit;

第四步,执行导入脚本,就能直接完成数据迁移了。

数据库文件备份

h2 数据库是基于文件的数据库,目标数据库就一以数据库名称命名的 .mv.db 文件。

生产环境下可以定期对该文件进行备份,当应用出现异常或需要迁移数据库时,直接拷贝数据库文件,相当方便。

缺点及适用场景

h2 数据库只适用于数据量比较小、且不需要一次全量查询的业务场景。

如果一个表有超过1万条数据,而且需要全量加载到内存中时,JDBC 查询操作可能会出现超时异常:「Statement was canceled or the session timed out 」。

什么是Statement Timeout?
statement timeout用来限制statement的执行时长,timeout的值通过调用JDBC的java.sql.Statement.setQueryTimeout(int timeout) API进行设置。不过现在开发者已经很少直接在代码中设置,而多是通过框架来进行设置。

原生的 JDBC Statement 类提供了超时时间设置方法 setQueryTimeout,一万条数据 h2 数据库查询耗时40秒,设置1分钟就可以解决这个异常了。

改为用原生 JDBC 查询,先查询总数,再以总数创建 List,后查询列表添加到 List 中:

// TODO 先查询总数
String countSql = "SELECT count(*) FROM  xx WHERE R_ID=?";
if (totalCount == 0) {return Collections.emptyList();}// TODO 查询记录列表
data = new ArrayList<>((int) totalCount);
String sql = "SELECT a,b from xx R_ID=?";stmt = conn.prepareStatement(sql);// 设置连接查询的超时时间,解决过滤规则过大时、规则查询 java.sql.SQLException: Statement was canceled or the session timed out; SQL statement:
stmt.setQueryTimeout(100);
stmt.setObject(1, id);
rs = stmt.executeQuery();// TODO 处理数据          

结论:查询语句的超时时间是关键因素,配置 fetchSize 对超时没有影响,但是它影响一次加载的数据量,配置的话可以降低内存、但是增加了查询时间。

与 SQLite 对比

想到之前有一个简单的应用监控程序,直接用了 SQLite 数据库。那么,h2 Database 和 SQLite都是开源的嵌入式文件数据库,它俩有什么区别呢?

特点h2 DatabaseSQLite
开发语言JavaC
运行模式嵌入式模式、服务器模式、混合模式嵌入式模式
连接方式嵌入式:JDBC ;服务器模式:JDBC、ODBC、TCP/IP ;混合模式:前面两者之和与开发语言一致,支持 JDBC、C++、Python、Perl、PHP
存储方式内存存储:应用退出数据消失;文件存储:持久化到磁盘文件存储:持久化到磁盘
SQL支持情况支持SQL92标准的绝大对数功能另,可兼容大多数主流数据库:MySQL/Postgre/Oracle/DB2支持SQL92标准的大多数功能无兼容性扩展
事务支持一般事务、支持MVCC支持一般事务
数据库锁共享锁/排它锁共享锁/排它锁
CPU和内存以插入100W数据为例,CPU平均占用60%,且波动频率较大,内存占用随着数据存储数量呈线性增长以插入100W数据为例,CPU平均占用45%,且波动平缓,内存占用随着数据存储数量呈线性增长。
性能单连接:随数据量读写时间呈线性增长;多连接:随数据量读写时间呈线性增长单连接:读数据时间不随数据量增长;写数据时间随数据量增长多连接:性能较差

启示录

可能是我们的项目比较简单,用到的语法也比较简单,没有涉及到特别高级的用法,比如事务、多连接之类的。

总结一下,作为网络笔记吧,省的下次排查问题又需要翻找了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463693.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再探“构造函数”(2)友元and内部类

文章目录 一. 友元‘全局函数’作友元‘成员函数’作友元‘类‘作友元 内部类 一. 友元 何时会用到友元呢&#xff1f; 当想让&#xff08;类外面的某个函数/其它的类&#xff09;访问 某个类里面的(私有或保护的)内容时&#xff0c;可以选择使用友元。 友元提供了一种突破&a…

告别枯燥数据!20种色彩缤纷的数据可视化图表任你选,轻松应对各种场景

我们每天都在和各种数据打交道&#xff0c;单纯的一串串数字&#xff0c;看着就头疼。如果数据不再是枯燥的表格&#xff0c;而是变成了色彩鲜艳的柱状图、线条流畅的折线图&#xff0c;或者是直观易懂的饼图&#xff0c;让用户一眼Get到重点&#xff0c;让老板为你的汇报方案鼓…

C++和OpenGL实现3D游戏编程【连载17】——着色器进阶(附源码)

🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 在前面着色器初步一节我们了解了着色器的一些初步知识,通过顶点着色器和片段着色器显示出了一个彩色的立方体。我们这节课就来了解一些在着色器中显示纹理等一系列实用操作,同时了解一些进阶的图像渲染技术,比如…

散热器为什么要加风扇:【图文讲解】

前面我们聊到了TEC散热器中&#xff0c;TEC的工作原理&#xff0c;也大概聊了一下热的整个传递过程。TEC散热器在工作的时候&#xff0c;会产生冷热两个端面&#xff0c;核心工作原理是通电后TEC把冷端的热量搬移到热端。这样把TEC散热器的冷端放置在需要散热的器件表面&#x…

HO-XGBoost河马算法优化极限梯度提升树多变量回归预测(Matlab)

HO-XGBoost河马算法优化极限梯度提升树多变量回归预测&#xff08;Matlab&#xff09; 目录 HO-XGBoost河马算法优化极限梯度提升树多变量回归预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现HO-XGBoost多变量回归预测&…

Zookeeper 简介 | 特点 | 数据存储

1、简介 zk就是一个分布式文件系统&#xff0c;不过存储数据的量极小。 1. zookeeper是一个为分布式应用程序提供的一个分布式开源协调服务框架。是Google的Chubby的一个开源实现&#xff0c;是Hadoop和Hbase的重要组件。主要用于解决分布式集群中应用系统的一致性问题。 2. 提…

[5] 一篇文章教会你如何实现端口敲门

文章目录 1. 描述2. 基本原理3. 优点4. 缺点5. 实现过程6. firewall-cmd命令介绍7. 写到最后 1. 描述 端口敲门技术(Prot Knocking)技术&#xff0c;用于通过一系列预定的端口来动态地打开防火墙或访问特定服务甚至执行一小段任务&#xff0c;用于增强系统地安全性&#xff0c;…

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件&#xff1a; 1. Deployment&#xff1a;跑起来N个pod&#xff1b;指定NVIDIA官方的triton&trt-llm的docker image&#xff0c;指定好model放在哪个…

Chainlit集成LlamaIndex实现知识库高级检索(HyDE查询重写转换)

检索原理 HyDEQueryTransform 是一种用于信息检索系统中的查询转换技术&#xff0c;它基于假设文档嵌入&#xff08;Hypothetical Document Embeddings&#xff0c;简称HyDE&#xff09;的概念&#xff0c;旨在通过生成假设文档来改善查询与文档之间的语义对齐&#xff0c;进而…

使用Markdown编写适用于GitHub的README.md文件的目录结构

文章目录 [toc] 顶部1. 使用[TOC]自动生成2. VSCode中的插件3. 手搓目录目录相关资料本文相关代码一、概述1.1 基本概念1.2 两种处理模型&#xff08;1&#xff09;微批处理&#xff08;2&#xff09;持续处理 1.3 Structured Streaming和Spark SQL、Spark Streaming关系 二、编…

[ shell 脚本实战篇 ] 编写恶意程序实现需求(恶意程序A监测特定目录B出现特定文件C执行恶意操作D-windows)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

攻克数字工具(GKData)在推动 AI 发展中的关键作用

摘要&#xff1a;本文深入探讨了攻克数字工具&#xff08;GKData&#xff09;对人工智能&#xff08;AI&#xff09;发展的重要推动作用&#xff0c;同时阐述了人工智能技术的发展历程、现状、应用领域和前景。分析了 GKData 在数据处理、模型训练与优化、算法创新等方面为 AI …

Golang文件操作

1.文件介绍&#xff1a;文件是数据源&#xff0c;主要作用是保存数据 2.文件在程序中是以流的形式来操作的 对文件的操作主要用File(os包)结构体来实现 文件的基本操作 1&#xff09;打开一个文件进行读操作&#xff1a; os.Open(name string)(*File,error) 2&#xff09;关…

WebSocket的理解与应用

WebSocket的理解与应用 一、是什么二、特点1、全双工2、二进制帧3、协议名4、握手5、优点 三、应用场景 一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达…

【补题/atccoder】Toyota Programming Contest 2024#7(AtCoder Beginner Contest 362)

A、买笔 思路&#xff1a; 输入红绿蓝三只笔价格&#xff0c;再输入不喜欢颜色&#xff0c; 输出除不喜欢颜色笔以外最低价格 代码如下&#xff1a; #include <iostream> #include <algorithm> using namespace std;int main() {int r, g, b;cin >> r >&…

【含开题报告+文档+源码】基于Web的房地产销售网站的设计与实现

开题报告 随着经济的发展和城市化进程的加速&#xff0c;房地产市场逐渐成为人们关注的焦点。然而&#xff0c;传统的房地产销售模式存在很多问题&#xff0c;如信息不透明、交易过程繁琐、无法满足个性化需求等。这些问题不仅影响了消费者的购房体验&#xff0c;也制约了房地…

网络层3——IP数据报转发的过程

目录 一、基于终点的转发 1、理解 2、IP数据报转发过程 二、最长前缀匹配 1、理解 2、主机路由 3、默认路由 三、二叉线索查找 一、基于终点的转发 1、理解 理解什么叫终点转发 IP数据报的传递&#xff0c;交给路由器后 可不可以做到直接发送给目的主机呢&#xff1f;…

【LwIP源码学习4】主线程tcpip_thread

前言 本文对lwip的主要线程tcpip_thread进行分析。 正文 tcpip_thread是lwip最主要的线程&#xff0c;其创建在tcpip_init函数中 sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);tcpip_init函数被TCPIP_Init函数调用。…

前端的导入导出「CommonJS」「ES Module」模块化规范

模块化开发有助于我们将代码进行拆分&#xff0c;便于开发和维护&#xff0c;但如果不清楚模块化规范&#xff0c;就会在开发时不知道该用 require 还是 import&#xff0c;导出时该用 export 还是 module.exports 参考博主文章

CoEdge: 面向自动驾驶的协作式边缘计算系统,实现分布式实时深度学习任务的高效调度与资源优化

文章导读 CoEdge系统的构思基于边缘计算的发展&#xff0c;这一分布式计算范式将服务从云端推向网络边缘&#xff0c;以支持各种物联网应用&#xff0c;如智能交通和自动驾驶。随着通信技术的进步&#xff0c;出现了新的协作边缘系统&#xff0c;多个边缘节点可以通过本地点对…