大家好,我是只谈技术不剪发的 Tony 老师。今天再给大家介绍一款基于 Java 的嵌入式关系型数据库:HSQLDB。
📝前文我们还介绍过另外两款基于 Java 的嵌入式关系型数据库:Apache Derby 和 H2。
HSQLDB 简介
HSQLDB(HyperSQL DataBase)是一个使用 Java 语言编写的开源关系型数据库,遵循自由的 BSD 协议。很多开源和商业产品都内置了一个 HSQLDB 数据库,包括 Apache ManifoldCF、OpenOffice、LibreOffice、Kepler、JBoss、Volt DB、Mathematica、Jira、Confluence、TeamCity 等。
HSQLDB 拥有 20 多年的开发历史,最初由 Thomas Mueller 创建,他也是另一个嵌入式数据库 H2 的创始人。目前,HSQLDB 的最新版本为 2.5.1(2020-06-29);源代码可以从 SourceForge 下载。HSQLDB 数据库的主要特点包括:
- 基于对数据库理论和 SQL 标准的深入研究创建的原创产品;
- 广泛支持 SQL: 2016 标准语法,包括大多数可选功能;
- 广泛兼容其他数据库语法模式;
- 为中小型数据库提供了非常快速的访问性能;
- 三种事务控制模式,包括加锁(两阶段锁)和 MVCC 模式,支持 REPEATABLE READ、READ COMMITTED 以及 SERIALIZABLE 隔离级别;
- 完全多线程支持;
- 纯 Java 实现,jar 文件只有 1.5 MB 左右,支持 JRE 6 以上环境;
- 广泛的 JDBC 接口支持,包括批量语句和滚动、可更新、可插入 ResultSet 功能,支持自定义的 Java 存储过程和函数;
- 支持 SQL 触发器和 Java 触发器,支持触发器的同步执行和异步执行;
- 支持 SQL 标准的全部基础数据类型,包括 TIMESTAMP WITH TIME ZONE、BINARY、BIT、BOOLEAN、 日期时间、INTERVAL、BLOB、CLOB 等,支持 ARRAY 对象,支持 SQL 计算列;
- 支持自定义 DOMAIN 类型,包括类型约束;
- 支持 system-versioned 时态表表,可以保存完整的数据变更历史;
- 快速 SELECT、INSERT、DELETE、UPDATE 操作,MERGE 语句支持单个或多个 INSERT、UPDATE、DELETE 选项;
- 内连接、左/右外连接以及全外连接,自然连接,USING 连接语法,LATERAL 连接和 UNNEST 操作符;UNION、EXCEPT、INTERSECT 集合操作符;
- 标量子查询、行子查询、表子查询以及关联子查询,包括 IN、EXISTS、ANY、ALL 操作符;
- 支持 WITH 递归查询(通用表表达式);
- 支持视图和临时表,包括可修改的视图;
- 支持主键、唯一约束和检查约束,支持外键参照完整性约束和级联操作;
- ORDER BY、GROUP BY、HAVING、FETCH(LIMIT)以及 OFFSET 子句;
- COUNT、SUM、MIN、MAX、AVG 以及统计聚合函数;
- 支持 SQL 表达式,例如 CASE … WHEN … ELSE … 、NULLIF、BETWEEN、MATCHES 等;支持 INTERVAL 表达式,例如 (CURRENT_DATE - 3 MONTH);
- 支持自增 IDENTITY 字段和序列;
- 提供了大量的内置函数;
- 支持事务控制语句 COMMIT、ROLLBACK 和 SAVEPOINT;
- 每个 JVM 可以创建多个数据库,每个数据库中可以创建多个模式;
- 支持 SQL 过程和函数,包括递归过程和函数;
- 基于密码的数据库安全,GRANT 和 REVOKE 语句管理的用户权限和角色,表级 DELETE 权限和列级 SELECT 和 UPDATE 权限;
- 丰富的 ALTER TABLE 命令,包括更改表的字段类型;
- 完整的 INFORMATION SCHEMA 视图;
- 查询优化器可以针对 AND、OR、IN 条件以及 ORDER BY、MAX、MIN 使用索引进行优化;
- 内存表提供了最快的访问性能,磁盘表支持大量数据,支持外部文本表(例如 CSV 文件);
- 快速 CLOB 和 BLOB 存储,最大 64 TB;磁盘表(CACHED TABLE)最大 8 TB,外部表最大 256GB;
- 通过内部增量备份提供快速启动和关闭功能;
- 支持在线和离线备份,支持数据库 SQL 脚本逻辑备份;
- 支持嵌入式和客户端/服务器操作模式,可以用于 applets、只读介质(CD),其他 jar 文件内部、webstart 和嵌入式应用;
- 支持三种客户端/服务器协议:HSQL、HTTP 以及 HSQL-BER;可以作为一个 HTTP web 服务器运行,包括 SSL 选项;
- 支持 ODBC 连接;
- 提供了一个强大的命令行管理工具 SqlTool,可以支持大部分主流数据库;
- 提供了两个简单的图形管理工具,一个用于不同数据库管理系统之间相互转换的工具,以及一个用于运行 SQL 测试脚本的测试工具。
让我们赶紧试用一下吧!
下载安装
打开 HSQLDB 官方网站提供的<Download>链接。
选择最新版本文件进行下载,解压缩之后的目录如下:
安装目录包含了一下内容:
- bin 目录包含了 Windows 系统下的实用脚本,以及如何在浏览器中嵌入 HSQLDB 的 HTML 文件;
- build 目录包含了ant build.xml 脚本,Gradle build 文件以及 MSDOS CMD build 文件;
- data 目录包含了数据库文件,默认为空;
- doc 目录包含了各种文档;
- lib 目录包含了运行 HSQLDB 和 GUI 工具的 hsqldb.jar 文件,以及 SqlTool 工具的 sqltool.jar 文件;
- sample 目录提供了一些示例脚本和配置模板;
- src 目录包含了所有的源代码;
- testrun 目录包含了一些测试 HSQLDB 和 SqlTool 的脚本。
最新版本的 HSQLDB 需要 Java 8 以上运行环境,可以点击下载安装并配置环境变量 JAVA_HOME,将 JDK 的 bin 目录添加到 PATH 环境变量,然后使用java -version
查看当前 Java 版本。
C:\Users\dongx> java -version
java version "13.0.1" 2019-10-15
Java(TM) SE Runtime Environment (build 13.0.1+9)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)
接下来就可以运行 bin 目录下的 runManagerSwing.bat(Windows)脚本启动 HSQLDB 数据库管理工具,该工具可以通过 JDBC API 连接各种数据库。
默认值 URL 连接的是内存数据库,点击下面的“OK”就可以连接 HSQLDB 数据库了。
其中,
- File 菜单可以建立或者关闭连接,运行和保存脚本,保存结果,退出等;
- View 可以用于设置界面显示;
- Command 提供了快速命令输入和语法帮助;
- Recent 记录了最近执行过的命令;
- Options 提供了一些设置选项;
- Tools 提供了实用工具,需要单独编译;
- Schemas 可以选择显示的模式;
- Help 提供了一些帮助信息。
界面左侧是数据库的连接信息和对象,右侧是 SQL 命令区域和执行结果。
执行 SQL 语句
在右侧 SQL 命令区域输入以下命令创建一个测试表:
create table test(id integer not null primary key, val varchar(50));
点击“Execute SQL”运行命令创建表。
此时,界面左侧增加了一个 TEST 表节点,命令区域下面显示了运行的结果。然后继续执行以下命令插入数据并查询结果:
insert into test values (1, 'a'), (2,'b'), (3,'c');
select * from test;
📝Options 菜单提供了一个生成示例表的脚本 Insert test data。
生成 DDL 语句
在命令区域输入 SCRIPT 命令查看数据库的 DDL 语句。
SCRIPT 命令支持文件名选项,例如 SCRIPT ‘filename’ 可以将 DDL 语句保存到指定文件中,包括生成数据的 SQL 语句。
📝除了 SCRIPT 命令之外,PERFORM EXPORT SCRIPT 和 PERFORM IMPORT SCRIPT 命令也可以用于导入导出数据库和表结构,具体可以参考官方文档。
断开数据库连接
输入 DISCONNECT 命令,或者点击 File 菜单中的 Close Connection 断开当前数据库连接。
关闭数据库
输入 SHUTDOWN 命令关闭当前当前数据库,对于内存存储模式同时会销毁所有的对象。
连接模式
H2 支持两种不同的连接模式:嵌入式(In-Process)和服务器(Server)模式。所有的模式都支持内存存储、磁盘持久化存储以及 Java 资源文件存储(只读)。
对于大多数应用,嵌入式模式的访问速度更快,因为数据不需要转换并通过网络传输;主要的缺点是默认情况下无法从应用程序外部连接数据库。
服务器模式提供了最大的可访问性,数据库引擎运行在 JVM 中,打开一个或多个嵌入的数据库。它可以监听同一个服务器或来自网络的连接请求,并将这些连接转换为进程内部的数据库连接。大多数服务器模式中,服务端可以服务大量的数据库和客户端连接。
开发环境同样推荐使用服务器模式,它运行在应用运行时通过其他工具查询数据库。根据连接协议的不同,服务器模式又可以分为三种:HyperSQL HSQL Server、HyperSQL HTTP Server 以及 HyperSQL HTTP Servlet。
HyperSQL HSQL Server 时推荐的运行模式,速度最快。这种模式会使用专用的通信协议。以下示例使用该模式启动服务,包含了一个(默认)数据库,数据库文件名为“mydb.*”,公开名称为“xdb”(隐藏了文件名)。
java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:mydb --dbname.0 xdb
命令行参数 --help 可以用于查看有效参数列表。
HyperSQL HTTP Server 模式适合服务器只能通过 HTTP 协议访问的场景。使用该模式的唯一原因就是客户端或者服务器由于防火墙限制只能使用 HTTP 协议,其他情况都不应该使用这种模式。该模式提供了一个特殊的 web 服务器,允许 JDBC 客户端通过 HTTP 连接数据库;它也可以作为一个小型通用的静态页面服务器使用。
如果想要运行 HTTP Server,可以将上面示例中的类名改成以下名称:
ava -cp ../lib/hsqldb.jar org.hsqldb.server.WebServer --database.0 file:mydb --dbname.0 xdb
命令行参数 --help 可以用于查看有效参数列表。
HyperSQL HTTP Servlet 模式通用使用 HTTP 协议访问数据库,用于 Servlet 引擎或者应用服务器(Tomcat、Resin 等)提供数据库访问。该模式无法独立于 Servlet 引擎启动,HSQLDB jar 文件中的 Servlet 类需要安装到应用服务器中以提供连接服务,数据库文件路径使用应用服务器配置属性指定。
HTTP Server 和 HTTP Servlet 模式都有可以通过 JDBC 驱动进行访问,但不提供 web 前端;HTTP Servlet 模式可以支持多个数据库。通常来说,在应用服务器中使用数据库引擎时通常不使用这种模式,而是通过进程内的方式连接数据库,或者使用单独的数据库服务器。
📝关于这三种服务器模式的配置和连接方式,可以参考官方文档。
命令行客户端
H2 数据库自带了一个命令行 Shell 工具,输入以下命令调用该工具:
C:\Users\dongx>java -cp "C:\Program Files (x86)\H2\bin\h2-1.4.200.jar" org.h2.tools.Shell
Welcome to H2 Shell 1.4.200 (2019-10-14)
Exit with Ctrl+C
[Enter] jdbc:h2:tcp://localhost/~/test
URL
[Enter] org.h2.Driver
Driver
[Enter] sa
User
Password
Connected
Commands are case insensitive; SQL statements end with ';'
help or ? Display this help
list Toggle result list / stack trace mode
maxwidth Set maximum column width (default is 100)
autocommit Enable or disable autocommit
history Show the last 20 statements
quit or exit Close the connection and exit
sql>
按照提示输入数据库的连接信息即可。接下来就可以输入各种 SQL 语句了:
sql> select now();
NOW()
2020-09-03 20:54:28.629717
(1 row, 2 ms)
输入 quit 或者 exit 可以退出客户端。
Maven 依赖
如果想要在自己的 Java 程序中使用 HSQLDB 数据库,可以添加以下 Maven 依赖:
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.5.1</version>
</dependency>
最新的版本配置可以查看 Maven Central。
资源文档
如果想要进一步深入了解和学习 HSQLDB 数据库,可以参考以下资源:
- HSQLDB 官方网站;
- HSQLDB 官方文档;
- tutorialspoint 在线教程;
- 管理开发工具:DBeaver、SQuirreL SQL、DbVisualizer。
总结
HSQLDB 是一款完全使用 Java 实现的关系型数据库,支持嵌入式、客户端/服务器部署模式。HSQLDB 数据库是一个成熟的产品,已经被大量开源和商业的软件作为嵌入式数据库使用。
如果觉得文章对你有用,欢迎关注❤️、评论📝、点赞👍!