1 hsqldb介紹
HyperSQL DataBase 是一個現代的關系數據庫管理軟件,比較徹底遵從SQL:2008標准和JDBC4規范。支持SQL:2008標准所以的核心特性和很多的可選特性。
HSQLDB-2.3版本,依照了SQL:2011標准進行了重寫。 遵從標准是HSQLDB最獨特的特點。
還提供了其他特色功能:
HyperSQL能夠在用戶 應用進程中、一個應用服務器中、或作為一個獨立的服務器進程提供數據庫訪問。
能夠完全地在內存中運行(使用極快的內存結構,而不是磁盤)
能夠靈活地使用磁盤持久提供可靠的崩潰恢復
是僅有的一個具備高性能專用大對象存儲系統(適用於GB級的大對象)的開源關系型數據庫管理系統
還是僅有的一個關系型數據庫,支持創建和訪問逗號分割的大文件作為SQL表
支持3個運行時可切換事務控制模型,包括完全多線程的多版本並發控制,適用於高性能的事務處理應用
還適用於商業智能、ETL、其他處理大數據集的應用
擁有廣泛的企業部署選項,如XA事務、連接池數據源、遠程認證
適用於數據庫應用的開發、測試、部署。
新的SQL語法兼容模型,已添加到HyperSQL中。這些模型允許與一些其他使用非標准SQL語法的數據庫系統高度兼容。
2 hsqldb.jar包中的組件
RDBMS Engine 數據庫管理系統引擎
JDBC Driver jdbc驅動
Database Manager GUI 數據訪問工具
3 HyperSQL中的Database
在HyperSQL中,每個database被稱為catalog。
有3中類型的catalog(取決於database中的數據是如何存儲的)
mem, 數據完全存儲在內存中,在JVM進程外沒有任何的持久。 用於數據測試、或作為應用的復雜的緩存
file, 數據存儲在文件系統
res, 存儲在一個Java資源中,如一個jar文件中(總是只讀的)
4 在進程內訪問數據庫
進程內訪問比較快,因為數據沒有轉換,也不用在網絡上發送。
缺點是,從應用的外部默認是不可能連接到數據庫的。因此,在應用運行時,你也就無法使用外部工具(如Database Manager GUI)來查看數據庫的內容。
通常格式:
Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:mymendb", "SA", "");
Connection conn = DriverManager.getConnection("jdbc:hsqldb:file:test/testdb", "SA", ""); //相對目錄,相對於啟動JVM的shell命令的執行目錄
Connection conn = DriverManager.getConnection("jdbc:hsqldb:res:org.my.path.resdb", "SA", "");
對數據庫做第一次進程內連接時,某些常規的數據結構會被初始化、一些幫助者線程將被創建。 在此之后,連接創建和對這些連接JDBC方法調用的執行,就好像是做這個調用的java應用的一部分一樣。
在SQL命令‘shutdown’執行后,數據庫的全局結構和幫助者線程將被銷毀。
5 服務運行模式 Server Modes
服務運行模式,提供了最大限度的可訪問性。
在JVM中運行的數據庫引擎,打開一個、或多個進程內catalogs。
它監聽來自在同一個computer或網絡上其他computer應用程序的連接,並轉換這些連接為到數據庫的進程內連接。
一些不同的應用程序(客戶端)都能夠連接到數據庫服務,檢索、更新信息,使用HyperSQL JDBC驅動。
在大多數server modes中,數據庫服務能夠服務不受限個數據庫(在數據庫服務啟動時指定,可選地,當接收到一個連接請求時)
在開發過程中,服務模式是運行數據庫的首選模型。在應用運行時,允許你從一個獨立的數據庫訪問工具查詢數據庫。
基於客戶端與數據庫服務通訊使用的協議,有3個服務模式:
HSQL Server
是運行一個數據庫服務的首選(最佳)方法,也是最快的一個。該模式使用一個私有的通訊協議。
運行命令:
hsqldb-2.3.2\data>java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:mydb/mydb --dname.0 my
啟動一個默認的數據庫(文件名:mydb/mydb, 公共名:my)
HSQL HTTP Server
該模式把數據庫服務限制為HTTP協議。使用該訪問方法的唯一原因是,客戶端、服務端防火牆的限制。在沒有該現在的場景中,不應該使用該模式。
HyperSQL HTTP Server 是一個特定的web服務器,運行JDBC客戶端通過HTTP連接。該服務器同樣能夠作為一個靜態頁面的小型通用的Web服務器。
HSQL HTTP Servlet
使用HTTP協議。當一個獨立的servlet引擎(Tomcat, Resin)、或應用服務器,要提供對數據庫的訪問時使用。該模式從servlet引擎獨立啟動。
在hsqldb.jar中的Servlet類應該被安裝到服務器中,以提供連接。使用一個應用服務器屬性指定數據庫文件的路徑
該模式能夠服務多個數據庫(同時跑多個數據庫)
HTTP Server 和 HTTP Servlet 模式,在客戶端使用JDBC驅動都能夠訪問。沒有給數據庫提供一個Web前端。
6 連接到一個Database服務器
連接到 一個本地的 hsql server :
Connection conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/my", "SA", "");
連接到 一個本地的 http server :
Connection conn = DriverManager.getConnection("jdbc:hsqldb:http://localhost/my", "SA", "");
7 測試例子
1)創建一個外部使用名為'my'的數據庫
2)使用hsqldb.jar管理數據庫
3)使用java查詢
public static void main(String[] args) throws SQLException { try { Class.forName("org.hsqldb.jdbc.JDBCDriver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Connection conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/my", "sa", ""); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select id, firstname, lastname from customer"); while (rs.next()) { System.out.println("id: " + rs.getInt("id")); System.out.println("firstname: " + rs.getString("firstname")); System.out.println("lastname: " + rs.getString("lastname")); }
rs.close();
stmt.close();
conn.close(); } /* id: 1 firstname: Asn lastname: Judy */