内存数据库Apache Derby、H2
概述
传统关系型数据库涉及大量的工作,如果想在Java应用程序里使用MySQL数据库,至少需要如下步骤:
- 安装(可选:配置用户名密码)
- 建表(要么从命令行进入,要么安装一个可视化工具,如DataGrip)
- 插入数据(可选)
- 配置连接信息(数据库的连接串,用户名,密码等信息)
还是有些繁琐。想象如下场景:
- 想要快速进行POC(Proof of Concept)概念验证测试
- 考虑单元测试
- 当数据库中的某些数据/模式发生更改时,不希望它们失败
- 可能希望能够并行运行它们,多个开发人员可能并行运行测试。
此时,内存数据库(In-Memory Database,嵌入式数据库)可提供一种较为理想的解决方案。在Java应用程序启动时创建内存数据库,并在应用程序停止时销毁。好处:
- 零项目设置或基础设施
- 零配置零维护
- 易于学习,POC和单元测试
总结,以存储介质来分类,数据库有两种:
- 内存数据库:数据主要存储在内存中,可将数据进行持久化到文件硬盘中。如Redis、H2DB的内存模式。由于内存容量有限,不适合大型应用。
- 硬盘数据库:最为常见。如SSDB是基于SSD硬盘的KV数据库,支持的数据接口很丰富,是Redis的另外一个选择。
举例
如SQLite、Berkeley DB、Derby、H2、HSQL DB、MySQL Embedded都是内存数据库。
Derby
官网
Apache Derby是100% Java编写,安装简单易管理,体积小,与平台无关的内存数据库,以 Java 类库的形式对外提供服务。支持的数据库最大50GB,支持标准SQL92,SQL1999,SQL2003,临时表,索引,触发器,视图,存储过程,外键,约束,并行,事务,加密与安全等。性能较好,在插入100万条记录时,CPU占用率一直低于 40%,平均每插一条记录耗时小于 0.3 毫秒。
支持两种运行模式:
- 内嵌模式:数据库与应用程序共享同一个JVM,通常由应用程序负责启动和停止,对除启动它的应用程序外的其它应用程序不可见,即其它应用程序不可访问它;
- 网络模式:数据库独占一个JVM,做为服务器上的一个独立进程运行。在这种模式下,允许有多个应用程序来访问同一个Derby数据库。
下载地址,需根据JDK版本下载相应的Derby版本。目前还在使用JDK8,故下载db-derby-10.14.2.0-bin.zip版本,解压后的目录:
- bin:工具脚本和设备环境的脚本;
- demo:实例程序;
- docs:文档;
- javadoc:API文档;
- lib:jar文件;
- test:测试jar包;
命令行
bin目录提供ij脚本。
D:\Program\db-derby-10.14.2.0-bin\bin> ./ij.bat
ij 版本 10.14
ij> show databases
> # 输出为空,表明此时没有任何数据库
> connect 'jdbc:derby:mydb;create=true';
IJ 错误:无法建立 connection # 连接数据库,没有则创建
ij> connect 'jdbc:derby:e:/mydb;create=true'; # 必须指定路径
ij> # 输出为空,表示执行成功无报错
看一下本地生成的目录:

接下来可以像MySQL那样操作:
ij> create table test(id int primary key, name varchar(22));
已插入/更新/删除 0 行
ij> insert into test values(1,'johnny');
已插入/更新/删除 1 行
ij> select * from test
> ; # 语句必须以英文分号结尾
ID |NAME
----------------------------------
1 |johnny
已选择 1 行
ij> disconnect; # 断开连接
ij> exit; # 退出,Ctrl+C
Java
Maven添加如下依赖:
<dependency><groupId>org.apache.derby</groupId><artifactId>derby</artifactId><version>10.14.2.0</version><scope>test</scope>
</dependency>
注意需要根据JDK版本号添加相应的Derby版本,JDBC demo示例代码略,过于简单。
H2
Spring Boot已经是Java开发者事实上的标准。SB提供简单配置,可在真实数据库(如MySQL)和内存数据库(如H2)之间切换。
H2是用Java编写的关系数据库管理系统,可嵌入Java应用程序中,也可以在客户端 - 服务器模式下运行。支持SQL标准的子集,还提供一个Web控制台(h2-console)来查看和维护数据库。使用时加入H2运行时依赖
<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope>
</dependency>
在application.properties中启用h2控制台功能:spring.h2.console.enabled=true
启动应用程序,可看到控制台打印输出:
o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:dc2f642f-cc93-48df-b170-4110b17384c3'
浏览器访问http://localhost:<server.port>/h2-console/,会自动跳转到http://localhost:8085/h2-console/login.jsp?jsessionid=e8c8fb0e00f5dff6fa6f59636cbb26c6,jsessionid每次都不一样。

注意上图中的JDBC URL默认为jdbc:h2:~/test,此时如果直接点Connect或Test Connection,都会报错,报错信息如上:Database not found。注意看应用启动时的控制台输出的关键信息。填入dc2f642f-cc93-48df-b170-4110b17384c3,然后点击Connect。成功,挑战到页面:

可以看到此界面和DataGrip还是有点相似,左侧是库和表信息,右边是SQL编辑框,上面有一些配置项,下面有命令解释和示例SQL脚本。最下面截图不完整的Adding Database Drivers
Additional database drivers can be registered by adding the Jar file location of the driver to the environment variables H2DRIVERS or CLASSPATH. Example (Windows): to add the database driver library C:/Programs/hsqldb/lib/hsqldb.jar, set the environment variable H2DRIVERS to C:/Programs/hsqldb/lib/hsqldb.jar.
大意是可以设置环境变量H2DRIVERS=<path_to_hsqldb.jar_file>
进阶
SB自动配置原理,在类路径中看到H2,就会自动配置数据源:
spring.datasource.url=jdbc:h2:mem:<uuid>
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
即,如果没有提供URL指定库名和表名,会使用UUID规则生成一个数据库
持久化
应用程序退出后,数据会从内存清除,怎么把数据持久化呢?H2提供持久化到文件的配置:
spring:datasource:driver-class-name: org.h2.Driverurl: jdbc:h2:file:/www/${spring.application.name}/db# Windows# url: jdbc:h2:file:C:/data/sample/${spring.application.name}/db;# 内存数据配置# spring.datasource.url=jdbc:h2:mem:testdbusername: sapassword:jpa:hibernate:ddl-auto: updatedatabase-platform: org.hibernate.dialect.H2Dialecth2:console:path: /h2enabled: truesettings:web-allow-others: true
可结合JPA或Spring Data JDBC一起使用,下面是JPA引入:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
@Entity标注实体类,@Id标注主键:
@Entity
public class Product {@javax.persistence.Idprivate String Id;private String name;
}
其他无需任何配置,SB启动时发现classpath中有m2就默认启动,同时建立product对应的H2数据表。
参考
- h2-file-database
- 内存数据库的发展现状和前景如何
相关文章:
内存数据库Apache Derby、H2
概述 传统关系型数据库涉及大量的工作,如果想在Java应用程序里使用MySQL数据库,至少需要如下步骤: 安装(可选:配置用户名密码)建表(要么从命令行进入,要么安装一个可视化工具&…...
麻省理工出版 | 2023年最新深度学习综述手册
UCL Simon Prince的新书:《Understanding Deep Learning》 ,在2023年2月6日由MIT Press出版。他之前写过很受欢迎的《Computer Vision: Models, Learning, and Inference》。 关于这本最新的深度学习手册,作者这样介绍它: 正如书…...
vi命令详解
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 13 2020 16:04:38) 用法: vim [参数] [文件 …] 编辑指定的文件 或: vim [参数] - 从标准输入(stdin)读取文本 或: vim [参数] -t tag 编辑 tag 定义处的文件 或: vim [参数] -q [errorfile] 编辑第一个出错处的文件 参数:…...
抖音的外卖行业入局,为中小外卖企业创业者的机会给了哪些机会?
一则关于抖音进入外卖市场的消息,让美团“非常受伤”。 2月8日,美团(03690.HK)盘中跌幅超9%。截至收盘,美团报收153.1港元,跌幅6.48%。美团大幅下跌的根源就是前一天关于抖音外卖进展的消息传闻。 2月7日,…...
供应PEG试剂AC-PEG-COOH,Acrylate-PEG-Acid,丙烯酸酯-PEG-羧基
英文名称:AC-PEG-COOH,Acrylate-PEG-Acid 中文名称:丙烯酸酯-聚乙二醇-羧基 丙烯酸酯-PEG-COOH是一种含有丙烯酸酯和羧酸的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联剂。丙烯酸酯可与紫外光或自由基引发剂聚合。丙烯酸酯-PE…...
java二叉排序树
1.先看一个需求 给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加 2.解决方案分析 使用数组 数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢. [示意图] 数组排序…...
聊一聊 gRPC 的四种通信模式
温馨提示:本文需要结合上一篇 gRPC 文章一起食用,否则可能看不懂。 前面一篇文章松哥和大家聊了 gRPC 的基本用法,今天我们再来稍微深入一点点,来看下 gRPC 中四种不同的通信模式。 gRPC 中四种不同的通信模式分别是:…...
科技云报道:开源真的香,风险知多少?
科技云报道原创。 过去几年,开源界一片火热,开源软件技术已全面进军操作系统、云原生、人工智能、大数据、半导体、物联网等行业领域。 数据显示,我国超九成企业在使用或正计划使用开源技术。 与此同时,全球各大开源组织相继兴…...
国产化适配迁移记录
国产化适配迁移记录 本项目基于RuoYi-Vue的框架进行迁移。目前已完成覆盖测试暂无其他问题。 国产化环境 名称版本达梦数据库DmJdbcDriver18 8.1.2.144通用mapper – tk.mybatismapper-spring-boot-starter 4.2.5<!-- 达梦数据库--><dependency><groupId>…...
又一国产开源项目走向世界,百度RPC框架Apache bRPC正式成为ASF顶级项目
2023 年 1 月 26 日,Apache 软件基金会 (ASF) 官方正式宣布Apache bRPC 正式毕业,成为 Apache的顶级项目。 我听到这个消息是挺开心的,毕竟是又一款由国人主导的apche顶级项目,再次证明国内在开源界正在发挥越来越重要的作用。 …...
多数据库学习之GBase8s查询数据库表元信息常用SQL
多数据库学习之GBase8s查询数据库表元信息常用SQL简介常用SQL创建用户创建数据库及模式获取表元数据其他参考链接简介 背景介绍 GBase 8t是基于IBM informix源代码、编译和测试体系自主研发的交易型数据库产品。 南大通用安全数据库管理系统(简称 GBase 8sÿ…...
Jetpack之Lifecycle应用与源码分析
Build lifecycle-aware components that can adjust behavior based on the current lifecycle state of an activity or fragment. 上面是源于官网的定义,简单翻译就是说Lifecycle的作用就是基于当前的Activity或者Fragment的生命周期当前状态构建可感知生命周期的…...
Python序列类型之集合
💐💐💐欢迎来到小十一的博客!!! 🎯博客主页:🎯程序员小十一的博客 🚀博客专栏:🚀Python入门基础语法 🌷欢迎关注ÿ…...
java 自定义json解析注解 复杂json解析
java 自定义json解析注解 复杂json解析 工具类 目录java 自定义json解析注解 复杂json解析 工具类1.背景2、需求-各式各样的json一、一星难度json【json对象中不分层】二、二星难度json【json对象中出现层级】三、三星难度json【json对象中存在数组】四、四星难度json【json对象…...
Vue3配置路由(vue-router)
文章目录前言一、配置路由(vue-router)1、安装路由2、新建页面3、创建路由配置文件4.特殊报错!前言 紧接上篇文章,vue3的配置与vue2是有所差别的,本文就讲述了如何配置,如果本文对你有所帮助请三连支持博主…...
【代码随想录二刷】Day9-字符串-C++
代码随想录二刷Day9 今日任务 28.找出字符串中第一个匹配项的下标 459.重复的子字符串 字符串总结 双指针总结 语言:C KMP 链接:https://programmercarl.com/0459.重复的子字符串.html#kmp 用处:当出现字符串不匹配时,可以利…...
google colab上如何下载bert相关模型
首先要知道模型的地址 tensorflow版本的模型: https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip pytorch版本的模型 ‘bert-base-cased’: …...
Vue2.0页面缓存机制联合页面标签的交互(keep-alive + router)
预期效果:(借助iview-ui的在线体验页面示意一下) 项目中只有一部分页面需要缓存,且存在多级路由的页面。每打开一个菜单,就会新增一个 Tab标签,只要 Tab标签不关闭,对应的页面就会被缓存&#x…...
C++STL剖析(四)—— stack和queue的概念和使用
文章目录1. stack的介绍2. stack的构造3. stack的使用🍑 push🍑 top🍑 pop🍑 empty🍑 size🍑 swap🍑 emplace4. queue的介绍5. queue的构造6. queue的使用🍑 push🍑 size…...
流浪地球 | 建筑人是如何看待小破球里的黑科技的?
大家好,这里是建模助手。 想问问大家今年贺岁档,都跟上没有,今天请允许我蹭一下热点表达一下作为一个科幻迷的爱国之情。 抛开大刘的想象力、各种硬核科技&以及大国情怀不提,破球2中的传承还是让小编很受感动,无…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
