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