H2存储内核分析一

简介: 现在做数据库一般都才有 C/C++ 获取其它编译型的语言,为什么会选择 h2 这种基于 java 的语言?会不会影响效率?其实回答这个问题很简单,无论是用什么语言来实现数据库,其实都是在调用操作系统 IO 的函数。因此仅仅是作为存储的话差别其实是不大的。现在大多数,涉及到存储内核的文章或者讲义,要么是一堆原理,要么就是玩具版本例子,根本无法应用到实际的工程上面去,就像马保国的闪电五连鞭一样。我们选择 h2 的一个重要原因就是,学习完后,可以直接应用到工程上。行不行直接在擂台上比一下就知道了。

开篇说明

  1. 现在做数据库一般都才有 C/C++ 获取其它编译型的语言,为什么会选择 h2 这种基于 java 的语言?会不会影响效率?其实回答这个问题很简单,无论是用什么语言来实现数据库,其实都是在调用操作系统 IO 的函数。因此仅仅是作为存储的话差别其实是不大的。
  2. 现在大多数,涉及到存储内核的文章或者讲义,要么是一堆原理,要么就是玩具版本例子,根本无法应用到实际的工程上面去,就像马保国的闪电五连鞭一样。我们选择 h2 的一个重要原因就是,学习完后,可以直接应用到工程上。行不行直接在擂台上比一下就知道了。

MVStore 的基础方法

1、创建一个 MVStore 的对象时,如果 fileName 设置为空表示纯内存模式。也就是说 MVStore 可以作为 redis 使用,当然功能会比 redis 还强大。

1.1、纯内存模式

// 创建一个纯内存的 storeMVStorestore=MVStore.open(null);

复制

1.2、磁盘模式

// 文件存储位置StringfileName="/Users/chenfei/temp/my_store.db";
// 创建一个 storeMVStorestore=newMVStore.Builder().fileName(fileName).pageSplitSize(1000).open();

复制

1.3、使用 MVStore.Builder() 生成 MVStore

MVStore.Builder() 常用方法

  1. 生成纯内存 store
MVStore.Builderbuilder=newMVStore.Builder();
MVStorestore=builder.open();

复制

  1. fileName(String fileName):设置存储MVStore数据的文件名
StringfileName="/Users/chenfei/temp/my_store.db";
MVStore.Builderbuilder=newMVStore.Builder();
builder.fileName(fileName);
MVStorestore=builder.open();

复制

  1. encryptionKey(char[] key):设置加密密钥,用于对MVStore的数据进行加密。如果不设置,则不进行加密。
StringfileName="/Users/chenfei/temp/my_store.db";
MVStore.Builderbuilder=newMVStore.Builder();
builder.encryptionKey("my_h2".toCharArray());
builder.fileName(fileName);
MVStorestore=builder.open();

复制

  1. compress():开启压缩选项,用于将MVStore的数据进行压缩,以减小存储空间。默认不开启。
StringfileName="/Users/chenfei/temp/my_store.db";
MVStore.Builderbuilder=newMVStore.Builder();
builder.encryptionKey("my_h2".toCharArray());
/*** 使用 LZF 算法在写入之前压缩数据。这将节省* 大约 50% 的磁盘空间,但会减慢读写速度操作轻微* */builder.compress();
builder.fileName(fileName);
MVStorestore=builder.open();

复制

  1. 禁用自动提交事务,需要手动提交。默认开启自动提交事务。
StringfileName="/Users/chenfei/temp/my_store.db";
MVStore.Builderbuilder=newMVStore.Builder();
builder.encryptionKey("my_h2".toCharArray());
/*** 使用 LZF 算法在写入之前压缩数据。这将节省* 大约 50% 的磁盘空间,但会减慢读写速度操作轻微* */builder.compress();
// 禁用自动提交事务,需要手动提交。builder.autoCommitDisabled();
builder.fileName(fileName);
MVStorestore=builder.open();

复制

  1. 设置MVStore为只读模式,不能进行写操作。
StringfileName="/Users/chenfei/temp/my_store.db";
MVStore.Builderbuilder=newMVStore.Builder();
builder.encryptionKey("my_h2".toCharArray());
/*** 使用 LZF 算法在写入之前压缩数据。这将节省* 大约 50% 的磁盘空间,但会减慢读写速度操作轻微* */builder.compress();
// 禁用自动提交事务,需要手动提交。builder.autoCommitDisabled();
// 设置MVStore为只读模式,不能进行写操作。builder.readOnly();
builder.fileName(fileName);
MVStorestore=builder.open();

复制

  1. 设置MVStore的缓存大小,单位为MB,默认为16MB。
StringfileName="/Users/chenfei/temp/my_store.db";
MVStore.Builderbuilder=newMVStore.Builder();
builder.encryptionKey("my_h2".toCharArray());
/*** 使用 LZF 算法在写入之前压缩数据。这将节省* 大约 50% 的磁盘空间,但会减慢读写速度操作轻微* */builder.compress();
// 禁用自动提交事务,需要手动提交。builder.autoCommitDisabled();
// 设置MVStore为只读模式,不能进行写操作。// builder.readOnly();// 设置MVStore的缓存为 8MB,默认为16MBbuilder.cacheSize(8);
builder.fileName(fileName);
MVStorestore=builder.open();

复制

  1. pageSplitSize(int pageSplitSize):数据页的大小是通过pageSplitSize方法进行设置的,默认值为4KB。MVStore使用了数据页的概念来管理存储的数据,将较大的数据文件拆分成多个小的数据页,以提高性能。每个数据页的大小是通过pageSplitSize方法进行设置的,默认值为4KB。当MVStore在写入数据时,首先会将数据写入内存缓存中,当缓存中的数据达到一定大小后,会将数据刷新到磁盘上,并拆分成多个数据页。如果数据大小超过了pageSplitSize的设置值,则会拆分成多个数据页。因此,pageSplitSize的设置值会影响数据拆分的粒度,进而影响MVStore的性能。 通常情况下,pageSplitSize的默认值可以满足大部分应用的需要。如果需要调整MVStore的性能,可以根据实际情况适当调整pageSplitSize的值。需要注意的是,pageSplitSize的值必须是2的幂次方。
StringfileName="/Users/chenfei/temp/my_store.db";
MVStore.Builderbuilder=newMVStore.Builder();
builder.encryptionKey("my_h2".toCharArray());
/*** 使用 LZF 算法在写入之前压缩数据。这将节省* 大约 50% 的磁盘空间,但会减慢读写速度操作轻微* */builder.compress();
// 禁用自动提交事务,需要手动提交。builder.autoCommitDisabled();
// 设置MVStore为只读模式,不能进行写操作。// builder.readOnly();builder.pageSplitSize(500);
builder.fileName(fileName);
MVStorestore=builder.open();

复制

  1. open():使用builder中的配置选项创建MVStore实例。
StringfileName="/Users/chenfei/temp/my_store.db";
MVStore.Builderbuilder=newMVStore.Builder();
MVStorestore=builder.open();

复制

生成MVStore实例的过程

如果是纯内存模式,它的 file header 就为空。只有是磁盘模式的时候才有 file header。

1、生成 MVMap

// 生成一个名为 cache_data 的 MVMap 对象
store.openMap("cache_data");

复制

MVStore 执行  openMap 方法的时候,如果 map 不存在就新建,存在就直接打开。如果是纯内存模式的,则是新建。

mvmap.png


2、MVMap 保存或者删除数据的过程

mvmap_put.png


3、MVStore 提交的过程

在 MVStore 中添加或者是删除数据,为了效率都是在内存中执行的,并没有刷到磁盘上,如果要刷到磁盘上需要调用 commite 方法。

store_commit.png


4、MVMap 查询的过程

mvmap_get.png


如果大家对存储内核有兴趣的话,可以加入 DawnSql 交流群,告诉我,我会继续写下去。DawnSql 交流群,在 https://docs.dawnsql.com/ 的首页可以查看(打开有点慢,稍等一下就可以了)

说明一点:有些朋友有疑问,为什么 DawnSql 选择 h2 的存储内核,而不是去重新做一个?这里主要是为了高用性!h2 作为成熟的数据库存储内核,已经在实际的项目中应用了多年,它是经得起考验的。如果新做存储内核,可能会给使用者带来高可用性上面的顾虑,所以我们再三权衡后选择更稳定可用性更高的方案。当然随着 DawnSql 的发展和根据企业方的要求,我们也可以对其进行修改和重构!


相关文章
|
存储 数据采集 监控
信息系统架构开发方法ADM
信息系统架构开发方法ADM
988 5
|
存储 固态存储 Java
Elasticsearch中查询性能优化
Elasticsearch中查询性能优化
434 0
|
API Android开发 开发者
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
347 2
|
10月前
|
SQL 关系型数据库 MySQL
MySQL 中的全文索引:强大的文本搜索利器
MySQL 的全文索引是一种用于快速搜索大量文本数据的特殊索引。它通过对文本内容进行分析(如分词、去除停用词等)并构建倒排索引,实现高效查找。创建全文索引使用 `CREATE FULLTEXT INDEX`,搜索时使用 `MATCH AGAINST` 语句。适用于 `CHAR`、`VARCHAR`、`TEXT` 等字段,但需注意性能影响和正确使用搜索语法。
470 22
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【10月更文挑战第1天】Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
491 3
|
存储 Oracle NoSQL
【赵渝强老师】Oracle的体系架构
Oracle数据库的核心在于其体系架构,主要包括数据库与实例、存储结构、进程结构和内存结构。数据库由物理文件组成,实例则是内存和进程的组合。存储结构分为逻辑和物理两部分,进程结构涉及多个后台进程如SMON、PMON、DBWn等,内存结构则包含SGA和PGA。掌握这些知识有助于更好地管理和优化Oracle数据库。
410 7
|
数据采集 缓存 安全
2024年最佳http 代理 IP选择及其价格分析
2024年,多家服务商如快代理、123Proxy、巨量代理、IPIDEA等提供不同类型的代理IP,以满足数据采集、跨境电商等多种需求。
2024年最佳http 代理 IP选择及其价格分析
|
云安全 运维 监控
过三级等保测评要用到的“堡垒机”是什么?
堡垒机,即运维审计系统,位于内外网络间,作为安全防护设备,确保所有远程访问均通过其进行,严格控制并记录访问行为,保障内部网络资源安全。其核心功能包括访问控制、操作审计、多因素身份认证、安全隔离、会话管理和策略执行。使用堡垒机可降低人为安全风险,简化账号管理,提升工作效率,并确保企业符合行业标准和法规要求。德迅云安全堡垒机则提供多云主机资产运维审计,涵盖多种协议,支持双因素认证及自动化运维,确保安全审计合规、高效易用。
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
430 2
|
存储 算法
USB3.2 摘录(10)
USB3.2 摘录(10)
251 1