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

内存数据库Apache Derby、H2

概述

传统关系型数据库涉及大量的工作,如果想在Java应用程序里使用MySQL数据库,至少需要如下步骤:

  • 安装(可选:配置用户名密码)
  • 建表(要么从命令行进入,要么安装一个可视化工具,如DataGrip)
  • 插入数据(可选)
  • 配置连接信息(数据库的连接串,用户名,密码等信息)

还是有些繁琐。想象如下场景:

  1. 想要快速进行POC(Proof of Concept)概念验证测试
  2. 考虑单元测试
    • 当数据库中的某些数据/模式发生更改时,不希望它们失败
    • 可能希望能够并行运行它们,多个开发人员可能并行运行测试。

此时,内存数据库(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 毫秒。

支持两种运行模式:

  1. 内嵌模式:数据库与应用程序共享同一个JVM,通常由应用程序负责启动和停止,对除启动它的应用程序外的其它应用程序不可见,即其它应用程序不可访问它;
  2. 网络模式:数据库独占一个JVM,做为服务器上的一个独立进程运行。在这种模式下,允许有多个应用程序来访问同一个Derby数据库。

下载地址,需根据JDK版本下载相应的Derby版本。目前还在使用JDK8,故下载db-derby-10.14.2.0-bin.zip版本,解压后的目录:

  1. bin:工具脚本和设备环境的脚本;
  2. demo:实例程序;
  3. docs:文档;
  4. javadoc:API文档;
  5. lib:jar文件;
  6. 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

概述 传统关系型数据库涉及大量的工作&#xff0c;如果想在Java应用程序里使用MySQL数据库&#xff0c;至少需要如下步骤&#xff1a; 安装&#xff08;可选&#xff1a;配置用户名密码&#xff09;建表&#xff08;要么从命令行进入&#xff0c;要么安装一个可视化工具&…...

麻省理工出版 | 2023年最新深度学习综述手册

UCL Simon Prince的新书&#xff1a;《Understanding Deep Learning》 &#xff0c;在2023年2月6日由MIT Press出版。他之前写过很受欢迎的《Computer Vision: Models, Learning, and Inference》。 关于这本最新的深度学习手册&#xff0c;作者这样介绍它&#xff1a; 正如书…...

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] 编辑第一个出错处的文件 参数:…...

抖音的外卖行业入局,为中小外卖企业创业者的机会给了哪些机会?

一则关于抖音进入外卖市场的消息&#xff0c;让美团“非常受伤”。 2月8日&#xff0c;美团(03690.HK&#xff09;盘中跌幅超9%。截至收盘&#xff0c;美团报收153.1港元&#xff0c;跌幅6.48%。美团大幅下跌的根源就是前一天关于抖音外卖进展的消息传闻。 2月7日&#xff0c…...

供应PEG试剂AC-PEG-COOH,Acrylate-PEG-Acid,丙烯酸酯-PEG-羧基

英文名称&#xff1a;AC-PEG-COOH&#xff0c;Acrylate-PEG-Acid 中文名称&#xff1a;丙烯酸酯-聚乙二醇-羧基 丙烯酸酯-PEG-COOH是一种含有丙烯酸酯和羧酸的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联剂。丙烯酸酯可与紫外光或自由基引发剂聚合。丙烯酸酯-PE…...

java二叉排序树

1.先看一个需求 给你一个数列 (7, 3, 10, 12, 5, 1, 9)&#xff0c;要求能够高效的完成对数据的查询和添加 2.解决方案分析 使用数组 数组未排序&#xff0c; 优点&#xff1a;直接在数组尾添加&#xff0c;速度快。 缺点&#xff1a;查找速度慢. [示意图] 数组排序&#xf…...

聊一聊 gRPC 的四种通信模式

温馨提示&#xff1a;本文需要结合上一篇 gRPC 文章一起食用&#xff0c;否则可能看不懂。 前面一篇文章松哥和大家聊了 gRPC 的基本用法&#xff0c;今天我们再来稍微深入一点点&#xff0c;来看下 gRPC 中四种不同的通信模式。 gRPC 中四种不同的通信模式分别是&#xff1a;…...

科技云报道:开源真的香,风险知多少?

科技云报道原创。 过去几年&#xff0c;开源界一片火热&#xff0c;开源软件技术已全面进军操作系统、云原生、人工智能、大数据、半导体、物联网等行业领域。 数据显示&#xff0c;我国超九成企业在使用或正计划使用开源技术。 与此同时&#xff0c;全球各大开源组织相继兴…...

国产化适配迁移记录

国产化适配迁移记录 本项目基于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 日&#xff0c;Apache 软件基金会 (ASF) 官方正式宣布Apache bRPC 正式毕业&#xff0c;成为 Apache的顶级项目。 我听到这个消息是挺开心的&#xff0c;毕竟是又一款由国人主导的apche顶级项目&#xff0c;再次证明国内在开源界正在发挥越来越重要的作用。 …...

多数据库学习之GBase8s查询数据库表元信息常用SQL

多数据库学习之GBase8s查询数据库表元信息常用SQL简介常用SQL创建用户创建数据库及模式获取表元数据其他参考链接简介 背景介绍 GBase 8t是基于IBM informix源代码、编译和测试体系自主研发的交易型数据库产品。 南大通用安全数据库管理系统&#xff08;简称 GBase 8s&#xff…...

Jetpack之Lifecycle应用与源码分析

Build lifecycle-aware components that can adjust behavior based on the current lifecycle state of an activity or fragment. 上面是源于官网的定义&#xff0c;简单翻译就是说Lifecycle的作用就是基于当前的Activity或者Fragment的生命周期当前状态构建可感知生命周期的…...

Python序列类型之集合

&#x1f490;&#x1f490;&#x1f490;欢迎来到小十一的博客&#xff01;&#xff01;&#xff01; &#x1f3af;博客主页&#xff1a;&#x1f3af;程序员小十一的博客 &#x1f680;博客专栏&#xff1a;&#x1f680;Python入门基础语法 &#x1f337;欢迎关注&#xff…...

java 自定义json解析注解 复杂json解析

java 自定义json解析注解 复杂json解析 工具类 目录java 自定义json解析注解 复杂json解析 工具类1.背景2、需求-各式各样的json一、一星难度json【json对象中不分层】二、二星难度json【json对象中出现层级】三、三星难度json【json对象中存在数组】四、四星难度json【json对象…...

Vue3配置路由(vue-router)

文章目录前言一、配置路由&#xff08;vue-router&#xff09;1、安装路由2、新建页面3、创建路由配置文件4.特殊报错&#xff01;前言 紧接上篇文章&#xff0c;vue3的配置与vue2是有所差别的&#xff0c;本文就讲述了如何配置&#xff0c;如果本文对你有所帮助请三连支持博主…...

【代码随想录二刷】Day9-字符串-C++

代码随想录二刷Day9 今日任务 28.找出字符串中第一个匹配项的下标 459.重复的子字符串 字符串总结 双指针总结 语言&#xff1a;C KMP 链接&#xff1a;https://programmercarl.com/0459.重复的子字符串.html#kmp 用处&#xff1a;当出现字符串不匹配时&#xff0c;可以利…...

google colab上如何下载bert相关模型

首先要知道模型的地址 tensorflow版本的模型&#xff1a; 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)

预期效果&#xff1a;&#xff08;借助iview-ui的在线体验页面示意一下&#xff09; 项目中只有一部分页面需要缓存&#xff0c;且存在多级路由的页面。每打开一个菜单&#xff0c;就会新增一个 Tab标签&#xff0c;只要 Tab标签不关闭&#xff0c;对应的页面就会被缓存&#x…...

C++STL剖析(四)—— stack和queue的概念和使用

文章目录1. stack的介绍2. stack的构造3. stack的使用&#x1f351; push&#x1f351; top&#x1f351; pop&#x1f351; empty&#x1f351; size&#x1f351; swap&#x1f351; emplace4. queue的介绍5. queue的构造6. queue的使用&#x1f351; push&#x1f351; size…...

流浪地球 | 建筑人是如何看待小破球里的黑科技的?

大家好&#xff0c;这里是建模助手。 想问问大家今年贺岁档&#xff0c;都跟上没有&#xff0c;今天请允许我蹭一下热点表达一下作为一个科幻迷的爱国之情。 抛开大刘的想象力、各种硬核科技&以及大国情怀不提&#xff0c;破球2中的传承还是让小编很受感动&#xff0c;无…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...