HSQL 資料庫介紹(1)--簡介

且行且码發表於2024-07-07

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>

相關文章