HSQLDB(HyperSQL Database)是一款用 Java 编写的关系数据库管理系统;它提供了许多功能,并严格遵循最新的 SQL 和 JDBC 4.2 标准;本文主要介绍其基本概念及安装。
1、简介
HyperSQL Database(HSQLDB)是一款现代的关系数据库系统。HSQLDB 遵循国际 ISO SQL:2016 标准,支持完整的经典功能集,以及可选功能,如存储过程和触发器。
HyperSQL 2.7 版本兼容 Java 11 或更高版本,下载的 zip 包中还包含了使用 JDK 8 编译的版本。在 hsqldb.org 官网上还提供了使用 JDK 6 编译的版本。
SQL 标准兼容性是 HyperSQL 最独特的特点。还有一些其他显著特性。HyperSQL 可以在用户的应用程序进程内或作为单独的服务器进程内提供数据库访问。HyperSQL 可以完全在内存中运行,使用快速的内存结构。HyperSQL 可以以灵活的方式使用磁盘持久化,具有可靠的崩溃恢复功能。HyperSQL 是唯一一个具有高性能专用 LOB 存储系统的开源关系数据库管理系统,适用于 GB 级的 LOB 数据。它也是唯一一个可以创建和访问大型逗号分隔文件作为 SQL 表的关系数据库。HyperSQL 支持三种可切换的实时事务控制模型,包括完全多线程的 MVCC,并适用于高性能事务处理应用程序。HyperSQL 还适用于商业智能、ETL 和其他处理大数据集的应用程序。HyperSQL 具有各种企业部署选项,如 XA 事务、连接池数据源和远程身份验证。
HyperSQL 新增了 SQL 语法兼容模式。这些模式允许与使用非标准 SQL 语法的其他数据库系统高度兼容。
2、HSQL jar 文件说明
HSQLDB jar 包(hsqldb.jar)位于 ZIP 包的 lib 目录中,包含多个组件和程序:
- HyperSQL RDBMS Engine(HSQLDB)
- HyperSQL JDBC Driver
- DatabaseManagerSwing GUI 数据库访问工具
HyperSQL RDBMS 和 JDBC Driver 提供了核心功能。DatabaseManagerSwing 是一个数据库访问工具,可与任何具有 JDBC 驱动程序的数据库引擎一起使用。
另外还有一个 jar 包,sqltool.jar,其中包含 Sql Tool,这是一个命令行数据库访问工具,也可以用于其他数据库引擎。
3、访问数据库工具
可以通过如下方法启动访问数据库的工具:
java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing #需要使用JDK11,根据实际情况指定jar包位置
4、HSQLDB 类型
根据数据存储方式,有三种类型的 HSQLDB:
- mem:完全存储在 RAM 中,没有持久性,超出 JVM 进程生命周期后数据将丢失。
- file:存储在文件系统中,以文件的形式保存。
- res:存储在 Java 资源中,例如 JAR 文件,且始终为只读状态。
mem:数据库可用于测试数据或作为应用程序的高级缓存。这些数据库没有任何文件。
file:数据库由 2 到 6 个文件组成,名称相同但扩展名不同,位于同一目录中。例如,名为"testdb"的数据库由以下文件组成:testdb.properties、testdb.script、testdb.log、testdb.data、testdb.backup、testdb.lobs。properties 文件包含有关数据库的一些设置。script 文件包含表和其他数据库对象的定义,以及内存表的数据。log 文件包含对数据库的最近更改。data 文件包含缓存表的数据,backup 文件用于恢复到数据文件的最后已知一致状态。所有这些文件都是必不可少的,不应该被删除。对于某些 catalog,testdb.data 和 testdb.backup 文件可能不存在。除了这些文件外,HyperSQL 数据库还可以链接到磁盘上任何格式化的文本文件,例如 CSV 列表。当 "testdb" catalog 处于打开状态时,会使用 testdb.log 文件记录对数据所做的更改。这个文件会在正常关闭时被删除,否则(异常关闭时),在下一次启动时将使用该文件来重做更改。testdb.lck 文件也被用来记录数据库是否处于打开状态。这个文件会在正常关闭时被删除。
res:数据库包括一个小型的只读数据库文件,可以存储在 Java 资源中,比如 ZIP 或 JAR 文件中,并作为 Java 应用程序的一部分进行分发。
5、连接模式
与 H2 类似,HSQLDB 也支持三种连接模式:
进程内模式(使用 JDBC 进行本地连接)
服务器模式(通过 TCP 或 HTTP 进行远程连接)
混合模式(同时进行本地和远程连接)
5.1、进程内模式
应用程序使用 JDBC 从同一个 JVM 中打开数据库。根据不同类型的数据库,JDBC 连接 HSQLDB 会有不同的 URL 写法。
A、mem catalog
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:mymemdb", "SA", "");
B、file catalog
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:d:/temp/test", "SA", "");
C、res catalog
Connection c = DriverManager.getConnection("jdbc:hsqldb:res:org.my.path.resdb", "SA", "");
5.2、服务器模式
对于大多数应用程序来说,进程内访问速度更快,因为数据不需要转换并通过网络发送。主要缺点是,默认情况下无法从应用程序外部连接到数据库。因此,在应用程序运行时,无法使用诸如数据库管理器之类的外部工具查询数据库的内容。
服务器模式提供了最大的可访问性。数据库引擎在 JVM 中运行并打开一个或多个进程内数据库。它监听来自同一台计算机或网络上其他计算机的程序的连接。它将这些连接转换为与数据库的进程内连接。
服务器模式也是开发过程中首选的运行数据库的模式。它允许您在应用程序运行时从单独的数据库访问工具中查询数据库。
基于客户端和服务器之间通信所使用的协议,有三种服务器模式。
5.2.1、HyperSQL HSQL Server
这是运行数据库服务器的首选方式,也是最快的方式。这种模式使用专有的通信协议。可以通过如下命令启功数据库:
java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:d:/temp/mydb --dbname.0 test #启动file数据库,数据库文件保存在d:/temp目录下,数据名称为 test
java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 mem:mydb --dbname.0 test #启动mem数据库,数据名称为 test
使用 JDBC 访问该数据库:
Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/test", "SA", "");
5.2.2、HyperSQL HTTP Server
这种访问方法用于数据库服务器只能使用 HTTP 协议的情况。使用此访问方法的唯一原因是客户端或服务器机器上的防火墙所施加的限制,不应在没有此类限制的情况下使用。HyperSQL HTTP 服务器是一个特殊的 Web 服务器,允许 JDBC 客户端通过 HTTP 连接数据库。可以通过如下命令启功数据库:
java -cp ../lib/hsqldb.jar org.hsqldb.server.WebServer --database.0 file:d:/temp/mydb --dbname.0 test #启动file数据库,数据库文件保存在d:/temp目录下,数据名称为 test
java -cp ../lib/hsqldb.jar org.hsqldb.server.WebServer --database.0 mem:mydb --dbname.0 test #启动mem数据库,数据名称为 test
使用 JDBC 访问该数据库:
Connection c = DriverManager.getConnection("jdbc:hsqldb:http://localhost/test", "SA", "");
5.2.3、HyperSQL HTTP Servlet
这种访问方法也使用 HTTP 协议。它通过 Servlet 引擎(如Tomcat)提供对数据库的访问。这种方式使用较少,这里就不详细介绍,可参考源文件 src/org/hsqldb/server/Servlet.java 查看详细信息。
5.3、混合模式
可以在应用中通过 Java 代码来启动 HSQLDB 的服务,这样本地和远程就都可以访问数据库了。
HsqlProperties p = new HsqlProperties();
p.setProperty("server.database.0","d:/temp/test");
p.setProperty("server.dbname.0","test");
Server server = new Server();
server.setProperties(p);
server.start();
6、关闭数据库
不同模式下运行的所有数据库都可以通过 SQL 语句 "SHUTDOWN" 来关闭。当发出 SHUTDOWN 命令时,所有活动事务都将被回滚。然后,数据库文件将以一种特定的形式保存,以便下次启动数据库时能快速打开这些文件。当通过 JDBC 显式关闭对数据库的最后一个连接时,数据库不会关闭。可以在第一连接数据库时指定连接属性 shutdown=true,以在最后一个连接关闭时强制关闭。
如果是在应用中启动数据库,可以通过编程方式关闭它。调用 org.hsqldb.server.Server的shutdownCatalogs(int shutdownMode)方法会关闭所有打开的数据库,导致服务器关闭。参数值通常为 1,表示正常关闭。还支持其他关闭模式,如 SHUTDOWN IMMEDIATELY。详细可查看 org.hsqldb.server.Server 的 javadoc。
7、创建新数据库
当启动数据库实例或与内部数据库建立连接时,如果给定路径上不存在数据库,则会创建一个新的空数据库。
在 HyperSQL 2.0 中,连接时指定的用户名和密码将用于新数据库。用户名和密码都区分大小写(例外是默认的SA用户,不区分大小写)。如果未指定用户名或密码,则使用默认的SA用户和空密码。
这个特性有一个副作用,可能会让新用户感到困惑。如果在指定连接到现有数据库的路径时写错了,仍然会建立与新数据库的连接。为了排除故障,您可以指定连接属性 ifexists=true,以仅允许连接到现有数据库并避免创建新数据库。在这种情况下,如果数据库不存在,getConnection() 方法将抛出异常。
8、安装
8.1、服务器模式
由于官网打不开,可从 sourceforge(https://sourceforge.net/projects/hsqldb/files/hsqldb/hsqldb_2_7/) 上下载 HSQLDB 的安装包然后解压既可。
8.2、进程模式和混合模式
引入相关依赖即可:
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.7.2</version>
</dependency>