Apache Derby - 功能强大的嵌入式数据库
引言
Nacos作为微服务注册配置中心,需要存储用户创建的配置和永久实例等信息,需要有持久化方案。目前Nacos支持使用内嵌的Derby数据库和外部的MySQL数据库作为存储。当我们使用单机模式或者集群模式下使用默认存储(即使用startup.sh -p embedded启动)时,Nacos会使用内嵌的Derby数据库来存储数据。那么接下来简要介绍下Derby数据库。
一、Derby 概述
1.1 Apache Derby 是什么
Derby 是一个开源的关系数据库,它是 Java 开发的一个完全兼容 JDBC 的数据库,属于 Apache 的一个开源项目,并且是一个容易管理的关系数据库管理系统,Apache Derby 是一个与平台无关的数据库引擎,它以 Java 类库的形式对外提供服务。与其他难以部署的数据库不同,Derby 数据库体积小、安装非常简单,只需要将其 *.jar
文件复制到系统中并为用户的项目添加该 *.jar
文件即可。
Derby官方主页:db.apache.org/derby/index…
1.2 特性与优势
- 开源数据库
Derby 是一个开源项目,这意味着任何人都可以获取并修改其源代码,使其适应自己的需求。与许多商业数据库不同,开源数据库可以大大降低开发成本,因为它们通常没有许可证费用或其他隐藏费用。此外,开源社区可以提供大量支持和资源,帮助开发人员更快地解决问题和学习新知识。
- JDBC 兼容性
JDBC(Java Database Connectivity)是 Java 与数据库进行交互的标准 API。Derby 完全支持 JDBC API,因此任何支持 JDBC 的 Java 应用程序都可以使用 Derby 进行数据库交互。这使得开发人员可以在项目中使用任何支持 JDBC 的数据库,提高了代码的可移植性。
- 嵌入式与网络部署
Derby 既可以在本地嵌入式环境中运行,也可以在网络服务器上部署。对于嵌入式模式,Derby 可以与应用程序一起打包并部署到客户端。对于网络模式,Derby 可以部署在服务器上,并通过网络与客户端通信。这种灵活性使得 Derby 可以适应各种应用场景,包括桌面应用程序、Web 应用程序和分布式系统。
- 轻量级与可扩展性
Derby 是一个轻量级数据库,它的内存占用和系统资源需求都很低。此外,Derby 还具有良好的可扩展性,可以通过添加自定义功能来扩展其性能。例如,可以通过添加索引、自定义数据类型或插件来提高查询性能和满足特定业务需求。
- 备份与恢复
在数据丢失成为常见问题的现代世界中,备份和恢复成为一个关键需求。Derby 提供了一系列备份和恢复工具,可以轻松地备份数据库并在需要时恢复数据。此外,Derby 还支持事务日志和增量备份,以确保数据的一致性和完整性。
- 安全性
在处理敏感数据时,安全性成为一个重要的考量因素。Derby 提供了一系列安全特性,包括用户认证、授权和数据加密。通过这些特性,开发人员可以保护数据库中的数据,防止未经授权的访问和恶意攻击。
- 性能优化
对于任何一个数据库,性能优化都是一个关键任务。Derby 提供了一系列性能优化特性,包括索引、查询优化和缓存。
- 事务处理
尽管轻量,Derby 提供了完整的事务处理能力,支持事务的原子性、一致性、隔离性和持久性(ACID),确保了数据的完整性和一致性。
- 支持 XML 与 JSON
现代应用程序通常需要处理大量的结构化数据和非结构化数据。Derby 支持 XML 和 JSON 数据类型,允许开发人员在数据库中存储和查询这些数据格式。这可以帮助开发人员更灵活地处理半结构化数据并满足特定业务需求。
1.3 运行模式
- 内嵌模式:Derby数据库与应用程序共享同一个JVM,通常由应用程序负责启动和停止,对除启动它的应用程序外的其它应用程序不可见,即其它应用程序不可访问它;Nacos主要使用此种模式来运行Derby数据库。
- 网络模式:Derby数据库独占一个JVM,做为服务器上的一个独立进程运行。在这种模式下,允许有多个应用程序来访问同一个Derby数据库。
注意:如果Derby没有足够的磁盘空间,它将立即关闭。
1.4 Apache Derby 组件
Apache Derby发行版提供了各种组件,在下载的apache发行版的lib文件夹中,可以观察到代表各种组件的jar文件。
Jar文件 | 组件 | 说明 |
---|---|---|
derby.jar | 数据库引擎和JDBC驱动程序 | Derby 数据库引擎是嵌入式关系数据库引擎,支持JDBC和SQL API。这也充当嵌入式驱动程序,使用它通过Java应用程序与Derby通信。 |
derbynet.jar derbyrun.jar | 网络服务器 | 提供了客户端服务器功能,可以在其中通过网络连接到Derby服务器。 |
derbyclient.jar | 客户端JDBC驱动程序 | |
derbytools.jar | 命令行工具 | 包含诸如 sysinfo、ij 和 dblook 之类的工具。 |
derbyoptionaltools.jar | 可选的命令行实用程序(工具) | 提供databaseMetaData、foreignViews、luceneSupport等 |
derbyLocale_XX.jar | Jar文件可对邮件进行本地化 | 使用这些,您可以本地化Apache Derby的消息。 |
二、使用方法
2.1 安装Derby
- Derby下载页面:db.apache.org/derby/derby…
要开始使用 Derby 作为服务器端数据库,需要从Derby官方网站下载 Derby 最新版本的zip或者tar包。把下载的安装包文件解压就可以了,解压后得到以下目录:
目录 | 说明 |
---|---|
bin | 包含了一些工具脚本和设备环境的脚本。 |
demo | 包含了一些实例程序。 |
docs | 包含了Derby的文档。 |
javadoc | 包含了Derby的API文档 |
lib | 包含了Derby数据库的jar文件 |
test | 一些测试jar包 |
接下来,需要启动 Derby 网络服务器。在服务器端的命令行通过执行以下命令启动Derby数据库服务器。
startNetworkServer -h localhost -p 端口号
localhost 是服务器地址,端口号 是希望 Derby 监听的网络端口,默认情况下,Derby 使用 1527 端口。
Derby启动成功后,就可以连接derby数据库了,执行命令如下:
# 连接内置Derby数据库
connect 'jdbc:derby:数据库;create=true|false';
# 连接网络derby数据库
connect 'jdbc:derby://数据库服务器IP:1527/数据库名;create=true|false';
- create=true,如果数据库不存在,那么就在当前目录,即启动ij的当前目录中创建数据库,并与所创建的数据库建立连接。如果数据库存在,那么不再创建数据库,直接与存在的数据库建立连接。
- create=false,如果数据库存在,就直接与存在的数据库建立连接。如果数据库不存在,不再创建数据库,直接放弃连接。
2.2 运行Derby
这里是以运行内嵌模式的Derby数据库为例进行说明。
-
建立连接:在命令行中找到bin目录,使用输入ij使用ij工具(或单击ij.bat后启动ij工具)。然后通过如下命令创建数据库,并与数据库创建连接。
connect 'jdbc:derby:dedb;user=root;password=root;create=true';
-
SQL操作:与数据库连接上后,就可以开始执行SQL语句了,也可以通过run命令来执行sql文件:
run '/derby/demo/nacos_schema.sql';
-
最后通过exit来退出ij工具,你可以在当前你命令行下所在的目录中找到一个derby.log的日志文件,derby在其中记录的数据库启动、关闭的信息。
2.3 JDBC操作Derby
我们经常使用JDBC进行:与一个数据库建立连接、向已连接的数据库发送SQL语句、处理SQL语句返回的结果等操作。
2.3.1连接内置Derby
-
加载Derby数据库驱动程序
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
-
连接内置Derby数据库
Connection con = DriverManager.getConnection("jdbc:derby:数据库;create=true|false");
2.3.2 连接网络Derby
-
加载Derby数据库驱动程序
Class.forName("org.apache.derby.jdbc.ClientDriver");
-
连接网络Derby数据库
Connection con = DriverManager.getConnection ("jdbc:derby://数据库服务器IP:1527/数据库;create=true|false");
三、Derby的应用集成
3.1 Nacos中Derby的应用
当我们使用单机模式或者集群模式下使用默认存储(即使用startup.sh -p embedded启动)时,Nacos会使用内嵌的Derby数据库来存储数据。服务启动后,在Nacos工作目录下data目录中生成derby-data目录。该目录即为derby的数据库工作目录,里面存储了derby数据库的所有信息。
使用Derby自带的ij脚本连接内嵌模式运行的Derby数据库,可以看到NACOS逻辑库。该库中包含了Nacos用户侧信息,包含账号密码,名称空间,配置等。对于需要持久化的数据,Nacos会将其写入Derby数据库中。
3.2 集成至项目
-
需要在你的pom文件中引入以下代码即可。
<dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <version>x.y.z</version> </dependency>
-
配置文件需配置
derby: databaseName: # 数据库位置 attributes: create=true # 创建数据库
-
创建连接代码
@Value("${derby.databaseName}") private String databaseName; @Value("${derby.attributes}") private String attributes; public DataSource createDataSource() { EmbeddedDataSource dataSource = new EmbeddedDataSource(); dataSource.setDatabaseName(databaseName); dataSource.setConnectionAttributes(attributes); return dataSource; }
-
启动项目即可。
结语
Derby 数据库以其开源、JDBC 兼容性、灵活性、扩展性、安全性以及性能优化等特点而受到广泛关注。无论是对于嵌入式应用程序还是网络应用程序,Derby 都能够提供强大的支持。通过了解和利用这些特性,开发人员可以更好地满足他们的需求并构建更高效的应用程序。
转载自:https://juejin.cn/post/7383281753144983579