HSQLDB文檔
一 什么是HSQLDB
HSQLDB具有以下特點:
l
????????
是一個開放源代碼的JAVA
數據庫
l
????????
具有標準的SQL
語法和JAVA
接口
l
????????
HSQLDB
可以自由使用和分發
l
????????
非常簡潔和快速的
l
????????
具有內存數據庫,獨立數據庫和C/S
數據庫三種方式
l
????????
可是在APPLET
中使用
更多的細節:
l
????????
索引可以被創建和自動使用
l
????????
支持事務處理
l
????????
允許表關聯
l
????????
完整性引用和約束
l
????????
支持JAVA存儲過程和函數
l
????????
數據庫可以生成SQL腳本
l
????????
使用用戶名,密碼,訪問權限等安全機制
l
????????
可以被JAVA1.1和JAVA2編譯
建立在HypersonicSQL基礎上的HSQLDB,是一個通用目的的數據庫,非常的小,而且易于安裝和使用??梢杂糜贏PPLETS中 ,測試中,應用系統中。
由于提供了標準SQL和JDBC接口,HSQLDB可以方便的和其他數據庫之間進行數據轉換。
HSQLDB的當前最新版本是1.7.1,以壓縮包的形式提供,包括可以使用的JAR文件,文檔,源代碼,測試程序,例子等。
二
操作模式介紹
HSQLDB有兩種操作模式:
l
????????
進程內模式(只用在同一個JVM里的應用程序才可以訪問數據庫)
l
????????
C/S模式(多個計算機/系統可以訪問同一個數據庫)
?
進程內訪問模式
進程內訪問模式也就是獨立模式。這里的獨立模式是相對于C/S模式(客戶端程序訪問數據庫服務器)而言的。這里,數據庫和應用程序運行在同一個JVM下。這個時候的數據庫實際上就是相當于被應用程序調用的代碼庫。程序和數據庫通過通用的JDBC調用進行通訊,但是這種調用是內部調用,不需要通過網絡通訊。
在這個模式下,同一時間一個數據庫只能有一個應用程序訪問,否則,就要使用C/S模式(允許多個JVM或者計算機在同一時間訪問同一個數據庫)。
?
這種模式下的JDBC的URL如下:
jdbc:hsqldb:test
這里,test是數據庫文件名。另一個例子(WINDOWS系統下):
jdbc:hsqldb:c:\db\test
?
?
C/S
訪問模式
這種模式下數據庫和應用程序不是運行在同一個JVM進程下,而是有自己獨立的進程或者是獨立的機器。 不需要客戶端程序進入服務器的文件系統。這種模式下的數據庫操作模式和一些大的數據庫(比如SQL SERVER,ORACLE等)沒什么區別的??梢栽贗NTERNET或者INTRANET。
HSQLDB除了有自己的訪問協議,還支持標準的HTTP協議,從而可以穿越防火墻或者代理服務器來訪問數據庫。
In all Server modes the actual database file name is specified in the Java command that starts the server. This can be the dot "." for all-in-memory operation or the path for the database name
?
服務器模式一共有三種:SERVER,WEBSERVER和SERVLET。
?
l
????????
SERVER
這種模式下的通訊協議是建立在TCP/IP基礎上的HSQL專有協議。每個客戶端都有一個獨立的連接。這種模式的響應速度是非??斓模绻褂肅/S模式,應該更多的采用這種服務模式。
這種模式下的JDBC URL是:
jdbc:hsqldb:hsql://hsqldbsrv
這里,hsqldbsrv是機器名稱。如果一臺機器上跑多個服務器,需要指定端口,例如:jdbc:hsqldb:hsql://hsqldbsrv:9002,如果是本地計算機,則使用localhost:jdbc:hsqldb:hsql://localhost。
?
l
????????
WEBSERVER
有些時候,由于防火墻或者代理服務器的存在,需要使用HTTP協議進行通訊,系統提供一個小而簡單的WEBSERVER用來相應針對數據庫的查詢,例如:
jdbc:hsqldb:http://websrv
?
l
????????
SERVLET
這種模式和WEBSERVER模式很類似,數據庫運行在一個SERVLET里,而SERVLET可以運行在幾乎所有的WEBSERVER里。而且和JAVA SERVLETE API兼容(測試環境是J2DK2.1)。這是通過網絡直接訪問的。如果你的SERVLET不能直接訪問這個數據庫,就不要使用這種模式。
?
全內存訪問(All-In-Memory
)模式
所謂全內存訪問模式,就是所有的數據(包括索引和記錄)都保存在主內存里。這意味著數據庫的大小是受到內存大小的限制的(不能超過內存的大?。?。支持這種模式的原因是:
l
????????
在非日志模式下,這種模式稍微快些
l
????????
可以在APPLET下使用
l
????????
用來存儲臨時數據(應用系統的數據緩存)All-In-Memory
JDBC URL如下:
jdbc:hsqldb:.
?
內存和硬盤結合訪問模式
?
在這種模式下,數據庫的改變會寫入到硬盤中,這就意味著在數據庫啟動時,內存里的表會根據他們的數據重新創建。或者說,可以創建表來保存數據,在訪問數據庫時,只有少量記錄時保存在內存里的??梢栽趧摻ǖ臅r候使用''''CREATE CACHED TABLE''''來代替''''CREATE TABLE''''。從而支持大表(這些表的記錄相對于內存來說太大了)。被緩存的表的索引也可以保存到硬盤中。因此,數據庫的大小就可以不受到內存大小的限制。進入緩存表要比從內存表里獲取數據要慢些。從1.7.0版本開始,支持第三種模式:數據可以存儲在文本文件(如CSV格式的文件)中。對應的語句時:''''CREATE TEXT TABLE''''。
在關閉數據庫前,當前狀態會被保存到磁盤中。緩存表中的數據會被保存到一個單獨的文件中。啟動HSQLDB時,數據庫從磁盤中載入數據(SQL腳本被執行),如果數據庫被毀壞(比如使用Ctrl+C或者斷電),數據也不會丟失。這是因為當下次數據庫重新啟動時,它使用腳本恢復到最近一次(有腳本文件的那次)的狀態。
?
?
混合綁定模式
所有的模式都可以在一個程序里使用,系統可以在統一時間使用這四種模式,去連接四種不同的數據庫,例如:
c1=DriverManager.getConnection("jdbc:hsqldb:.","sa","");
c2=DriverManager.getConnection("jdbc:hsqldb:test","sa","");
c3=DriverManager.getConnection("jdbc:hsqldb:http://dbserver","sa","");
c4=DriverManager.getConnection("jdbc:hsqldb:hsql://dbserver","sa","");
在這個例子中,四個連接被打開:
c1是內存數據庫;c2打開的是本地數據庫test;c3使用http協議連接dbserver數據庫;c4也是連接dbserver機器,但是使用的是更快的hsql協議。這里的限制就是:只有一個進程內的全內存進程是可用的。
?
比較
每種模式或配置都有不同的細節和好壞兩個方面:
l
????????
事務處理
對于webserver和servlet模式而言,由于HTTP協議是無狀態的,因此,每個查詢數據庫都建立新的連接。每次查詢都需要發送用戶名和密碼到數據庫中,然后建立一個新的連接,同時也建立一個新的事務(因為事務是綁定到連接中的)??梢允褂谩痗ookies’,但是現在還沒有實現。
l
????????
并發訪問
SERVER模式允許系統和管理工具(比如DatabaseManager同時訪問數據庫)。
l
????????
數據庫性能優化因素
內存數據庫不需要訪問系統,因此是最快的。其他模式的數據庫需要訪問文件系統,每個INSERT/UPDATE/DELETE操作都要保存到磁盤中,因此速度慢些。如果select和delete查詢命中了緩存表的信息,則速度幾乎和內存表速度一樣快,否則就要慢許多(因為要和操作系統的文件系統交互)。
l
????????
每個statement的傳輸時間
在SERVER模式,每個statement都需要通過TCP/IP協議傳送到服務端,然后將結果返回到客戶端。而webserver和servlet模式則需要更多的時間,因為每次statement都需要重新建立連接。相對照的,進程內模式則是在一個系統內部傳送數據,就快多了。
?
l
????????
以APPLET方式運行
這就是全內存操作。