關系數據庫系統簡介
您可以很快就開始開發數據庫應用程序,但可能要花一生的時間來掌握它。幸運的是,Apache Derby 是輕量級數據庫,您不必用畢生的精力來精通它。按照本文的下列步驟操作之后,就能夠開始使用它了。
但本系列的目標不僅僅在于讓您入門,而旨在幫助您掌握使用 Apache Derby。首先,應熟悉 ACID 測試,它提供了對關系數據庫基本原則的壓縮封裝。
![]() ![]() |
![]()
|
ACID 測試
鉆石顯然是十分貴重的東西,正因為貴重,所以才會嚴肅對待贗品被。確定鉆石是真是假的一個簡單而(至少在電影里)流行的測試是讓它在一片玻璃上滾。因為鉆石是眾所周知最堅硬的材料,真正的鉆石很容易切割玻璃表面;而贗品,尤其是用玻璃本身制作的贗品,則無法做到。
對軟件開發人員來說,數據庫也有這么貴重。如果使用數據庫的話,需要確保它安全存儲數據并允許您將來檢索數據。您還希望數據庫允許多個程序使用數據庫而不會相互干擾。為了演示,假設您擁有一個銀行。銀行的數據庫必須具備下列功能:
這些任務可以合稱為 ACID 測試;ACID 是 Atomicity(原子性)、Consistency(一致性)、Isolation(隔離性)和 Durability(持久性)的縮略詞。
原子性 指數據庫操作可以組合到一起,當作單個單元處理。
一致性 保證此單個單元(或事務)中的所有操作要么都成功執行,要么都不執行。換句話說,數據庫不能處于未完成狀態。要了解這些特征為何如此重要,可考慮這樣一個銀行事務:即錢從儲蓄帳戶轉到支票帳戶。如果在將錢從儲蓄帳戶減去之后、加到支票帳戶之前,轉帳處理失敗,那么您就會變窮,而銀行將會有一個憤怒的(前)客戶!原子性使得這兩個操作 —— 從儲蓄帳戶減錢和向支票帳戶加錢 —— 被當作單個事務進行處理。一致性保證事務中的這兩個操作同時成功或同時失敗。這樣,您的錢就不會丟失了。
隔離性 指獨立的數據庫事務集合以不相互沖突的方式執行。仍使用這個銀行類比,考慮兩個客戶同時在帳戶之間轉移資金。數據庫必須分別跟蹤兩個轉帳;否則,資金可能進入錯誤的帳戶,而銀行可能得多兩個憤怒的(前)客戶。
持久性 保證數據庫是安全的,不會異常終止。當電源斷電時,如果電視或計算機不工作,這可能是小麻煩,但同樣的事情對于數據庫來說就不一樣了。如果銀行計算機在轉移資金時掉電,導致交易丟失,您就不會是個快樂的客戶了。持久性保證如果數據庫在資金轉移期間異常終止,則當數據庫重新啟動時,它將能夠恢復交易并繼續正常的操作。
通過 ACID 測試不容小覷,許多簡單的數據庫都做不到。對于關鍵的電子商務或基于 Web 的應用程序,通過 ACID 測試是必不可少的。這就是為什么如此多的公司和個人利用企業級數據庫系統(比如 IBM DB2® Universal Database、Oracle 10g 或 Microsoft® SQL Server)的原因之一。這些數據庫與 ACID 測試完全兼容。與這些數據庫系統相比,Apache Derby 數據庫就像是被遺忘的后娘生的孩子一樣。但是,Apache Derby 與 ACID 測試完全兼容,您可以放心地使用它開發基于 Web 的數據庫應用程序。此外,如果開始使用 Apache Derby,而且您的應用程序(或業務)在增長,則可以毫不費力地將數據庫應用程序移植到 DB2 等企業級數據庫系統。
![]() ![]() |
![]()
|
用 Apache Derby 創建數據庫
在使用數據庫之前,必須創建一個數據庫。在 Derby 下載和安裝過程中,您會獲得幾個工具。其中的 ij 是交互式 Java™ 工具,用于與 Apache Derby 數據庫服務器通信。下文將展示如何使用 ij 工具執行簡單的數據庫操作,比如創建數據庫。
在 本系列的第一篇文章 中,學習了如何下載和安裝 Derby 軟件。如果還沒有閱讀該文章,那么現在應該讀一讀。具體來說,按照指導進行下載和安裝,才能在計算機上具有 Apache Derby 軟件的一個可以工作的版本。
第一篇文章的結尾討論了如何正確設置系統以使用 Derby 數據庫??傊?,因為 Derby 是 Java 應用程序,所以必須正確初始化 CLASSPATH
環境變量??梢栽O置 DERBY_INSTALL
環境變量,然后將相關的 Java Archive (JAR) 文件添加到 shell 初始化文件(比如 .bashrc 文件)中的 CLASSPATH
中,命令如下:
export DERBY_INSTALL='/opt/Apache/db-derby-10.1.2.1-bin'
export CLASSPATH=$DERBY_INSTALL/lib/derby.jar
export CLASSPATH=$CLASSPATH:$DERBY_INSTALL/lib/derbytools.jar:.
通過創建批處理文件可以在 Microsoft Windows® 系統上獲得同樣的效果,命令如下:
set DERBY_INSTALL=C:\Apache\db-derby-10.1.2.1-bin
set CLASSPATH=%DERBY_INSTALL%\lib\derby.jar
set CLASSPATH=%CLASSPATH%;%DERBY_INSTALL%\lib\derbytools.jar;.
注意:在這兩個示例中,CLASSPATH
環境變量的初始化(通過 export
或 set
shell 命令)都用兩個步驟完成。這純粹是因為本文篇幅所限??梢栽谧约旱淖兞砍跏蓟惺褂靡恍谢騼尚?。
現在只要打開新命令提示,就可以運行該批處理文件。不管是 Windows 還是 UNIX® 腳本文件,一定要確保正確指定安裝 Derby 軟件的目錄。
正確設置了環境之后,可以運行 ij 工具來創建新的目錄,如 清單 1 所示。
|
首先,顯示 CLASSPATH
環境變量。這樣做有時是避免以后出錯的好辦法。在這里,Derby JAR 文件明顯存在。下一步是創建并更改為可以工作的新目錄(在本例中目錄叫做 derbyWork,但您可以隨意使用任何名稱)。這就更容易看清使用 ij 工具創建新數據庫時發生的事情。預備工作完成之后,可以開始啟動 ij 了。
因為 ij 工具是 Java 應用程序,因此需要啟動 Java Virtual Machine (JVM),并指出要運行的相應主類的名稱,在這里是 ji 工具。如果獲得 Java 異常,則重新檢查 CLASSPATH
以確保 derbytools JAR 文件存在。
當 ij 工具啟動時,顯示版本信息并提供提示符,提示符默認情況下是一個大于符號 (>)。在該提示符下,運行 connect
命令,連接數據庫。connect
命令需要一個指示符字符串用于查找要連接的數據庫。在本例中,該連接字符串是 jdbc:derby:test;create=true
。正式地,該字符串稱為 Java Database Connectivity (JDBC) URL。(JDBC 是一種 Java 技術,允許 Java 應用程序與數據庫通信。)
對 JDBC URL 的完全分析超出了本文范圍(請參閱 參考資料 部分獲得更多信息)。但是,本例十分簡單,可分解如下:
jdbc
是 ij 工具與數據庫服務器通信的機制。 derby
是 JDBC 驅動程序類的名稱,ji 工具使用該類與數據庫服務器通信。 test
是要創建的數據庫名稱。 create=true
是應傳遞給 Derby JDBC 驅動程序的特定屬性。 JDBC 屬性列在 URL 其他部分的后面,并用分號分隔。
要正確訪問,必須將 JDBC URL 作為字符串傳遞給 connect
命令;因此需要將其封裝在單引號 (') 字符里。最后,告訴 ij 工具處理命令,必須添加分號(因為 ji 是 Java 工具)并按下 Return。在短暫的延遲之后,ij 工具提供一個新提示符。那就是 —— 新數據庫已創建。
想知道發生了什么,使用 exit
命令(別忘了分號)退出 ij 工具,查看運行 ij 工具的目錄(在 UNIX 系統上使用 ls
命令,在 Windows 系統上使用 dir
命令)。這樣就生成一個新文件以及一個新目錄,叫做 test,它與在 JDBC URL 中為數據庫命名的名稱相匹配。
如果感到好奇的話,可以研究為您的數據庫創建的 test 目錄,如 清單 2 所示。(目錄的名稱和內容可能與這里顯示的稍有不同。)
|
研究這些目錄時,可能會對創建新目錄時發生的所有動作感到吃驚。但要記住,Apache Derby 是 ACID 兼容的數據庫,因此,后臺發生了好多事情。數據庫主目錄(本例中為 test)內有一個 log 目錄、一個 seg0 目錄和一個屬性文件。log 目錄保存特定于數據庫的日志文件,這些文件允許 Derby 記錄在一組數據庫操作(一個事務)期間發生的操作。如果 Derby 數據庫服務器在操作期間由于某種原因終止,則它可以保存停止的位置,并將數據庫恢復到正常狀態。
在本例中,seg0 目錄保存將用于測試數據庫的數據文件。很奇怪,所有這些文件都是在數據庫剛剛創建時生成的,推測起來應該是空的。原因非常簡單:當數據庫存儲數據時,它不僅創建一個新的文件,還會將數據轉儲到該文件中。由于性能原因(并滿足 ACID 測試),數據庫將數據分攤到許多文件中。數據在寫入文件時具有特定的結構,稱為頁面。數據頁面的內容包括頁面上的數據和有關頁面上數據的信息(有時稱為元數據)。通過在數據庫首次創建時生成所有這些文件(和文件中的頁面),數據庫可以開始盡快地存儲數據。
![]() ![]() |
![]()
|
ij 工具
ij 工具功能十分強大??捎盟ㄔ趯淼奈恼轮校﹫绦蟹秶鷱V泛的操作,包括創建數據庫(如前所述)和在數據庫內創建新項。ij 工具包括一個 help
命令,可以列出和描述要使用的一些常見命令,如 清單 3 所示。注意,為了適應空間限制,該清單已被重新格式化,所以您的版本看起來可能稍有不同。
|
清單 3 所示的大多數命令似乎都很陌生,當然啦,您還剛開始學習 Apache Derby。
還可以使用 ij 工具與數據庫建立多個連接,如 清單 4 所示。
|
本例首先嘗試使用原始的 JDBC URL 連接測試數據庫。但是獲得一個警告,因為測試數據庫已經存在。代碼發出一個新 connect
命令以更改 JDBC URL,從而去掉 ;create=true
JDBC 屬性。這時沒有發出警告,但提示符更改為包括一個 (CONNECTION1)
字符串。這看起來不太正常,因為在第一次創建測試數據庫時沒有發生這種情況。
該結果說明,盡管有警告,但創建數據庫連接的第一次嘗試成功了。為了展示已經有到同一數據庫的兩個連接,發出 show connections ;
命令,將顯示兩個連接、關聯的 URL 以及當前連接(在本例為 CONNECTION1
)。
現在不需要到同一數據庫的兩個連接,因此可以使用 disconnect ;
命令關閉當前連接。發出另一個 show connections ;
命令將顯示當前惟一打開的連接,但還會看到沒有當前連接。因為需要具有活動的或當前的連接向特定數據庫發送命令,所以應該相應地更改當前連接。使用 set connections
命令,將目標連接名稱作為最終參數,可以容易地實現這一點?,F在,發出另一 show connections ;
命令時,將看到當前連接的列表以及當前連接的名稱。最后,發出 exit ;
命令斷開所有當前連接并終止 ij 工具。
![]() ![]() |
![]()
|
結束語
本文介紹了關系數據庫,并側重于 ACID 測試。ACID 測試允許開發人員測量數據庫系統的利用率。如果需要基于 Java 的輕量級數據庫來支持通過 ACID 測試需要的完整能力,則應采用 Apache Derby 數據庫。本文還介紹了 Derby 數據庫附帶的 ij 工具。ij 工具可用于連接數據庫并向數據庫發出命令。本文使用 ij 工具創建了一個新數據庫,然后研究了 Derby 創建新數據庫時生成的目錄和文件。
查看本系列的下一期文章,將會獲得使用模式進行數據庫開發的全面概述。
原文轉自:http://www.anti-gravitydesign.com