用 Apache Derby 進行開發 —— 取得節節勝利: 使用 Apache Derby 進行數據庫開發,第 1 部

發表于:2007-05-24來源:作者:點擊數: 標簽:開發Derby節節勝利取得apache
想要立刻開始使用 Apache Derby 嗎?這個由多個部分組成的系列屬于 用 Apache Derby 進行開發:取得節節勝利 專欄,它將帶領您立刻使用 Derby 數據庫。第 1 部分介紹關系數據庫的基本概念,并側重于這些主題與 Derby 數據庫的關系。您將學習 ACID 測試 (用一
想要立刻開始使用 Apache Derby 嗎?這個由多個部分組成的系列屬于 “用 Apache Derby 進行開發:取得節節勝利” 專欄,它將帶領您立刻使用 Derby 數據庫。第 1 部分介紹關系數據庫的基本概念,并側重于這些主題與 Derby 數據庫的關系。您將學習 ACID 測試(用一個簡單的示例演示)和 ij 工具,該工具可用于交互連接和查詢 Apache Derby 數據庫。然后,本系列的測試將幫助您成為使用 Apache Derby 的高手。

關系數據庫系統簡介

您可以很快就開始開發數據庫應用程序,但可能要花一生的時間來掌握它。幸運的是,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 環境變量的初始化(通過 exportset shell 命令)都用兩個步驟完成。這純粹是因為本文篇幅所限??梢栽谧约旱淖兞砍跏蓟惺褂靡恍谢騼尚?。

現在只要打開新命令提示,就可以運行該批處理文件。不管是 Windows 還是 UNIX® 腳本文件,一定要確保正確指定安裝 Derby 軟件的目錄。

正確設置了環境之后,可以運行 ij 工具來創建新的目錄,如 清單 1 所示。


清單 1. 使用 ij 工具
rb$ echo $CLASSPATH
            /opt/Apache/db-derby-10.1.2.1-bin/lib/derby.jar:
            /opt/Apache/db-derby-10.1.2.1-bin/lib/derbytools.jar:.
            rb$ mkdir derbyWork
            rb$ cd derbyWork
            rb$ java org.apache.derby.tools.ij
            ij version 10.1
            ij> connect 'jdbc:derby:test;create=true' ;
            ij> exit ;
            rb$ ls -CF
            derby.log       test/
            

首先,顯示 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 所示。(目錄的名稱和內容可能與這里顯示的稍有不同。)


清單 2. test 目錄的內容
rb$ ls -CF test/
            log/                    seg0/                   service.properties
            rb$ ls -CF test/log/
            log.ctrl        log1.dat        logmirror.ctrl
            rb$ ls -CF test/seg0/
            c10.dat         c191.dat        c221.dat        c2c1.dat       c90.dat
            c101.dat        c1a1.dat        c230.dat        c2d0.dat       ca1.dat
            c111.dat        c1b1.dat        c241.dat        c2e1.dat       cb1.dat
            c121.dat        c1c0.dat        c251.dat        c2f0.dat       clearcase/" target="_blank" >cc0.dat
            c130.dat        c1d1.dat        c260.dat        c31.dat        cd1.dat
            c141.dat        c1e0.dat        c271.dat        c41.dat        ce1.dat
            c150.dat        c1f1.dat        c281.dat        c51.dat        cf0.dat
            c161.dat        c20.dat         c290.dat        c60.dat
            c171.dat        c200.dat        c2a1.dat        c71.dat
            c180.dat        c211.dat        c2b1.dat        c81.dat
            

研究這些目錄時,可能會對創建新目錄時發生的所有動作感到吃驚。但要記住,Apache Derby 是 ACID 兼容的數據庫,因此,后臺發生了好多事情。數據庫主目錄(本例中為 test)內有一個 log 目錄、一個 seg0 目錄和一個屬性文件。log 目錄保存特定于數據庫的日志文件,這些文件允許 Derby 記錄在一組數據庫操作(一個事務)期間發生的操作。如果 Derby 數據庫服務器在操作期間由于某種原因終止,則它可以保存停止的位置,并將數據庫恢復到正常狀態。

在本例中,seg0 目錄保存將用于測試數據庫的數據文件。很奇怪,所有這些文件都是在數據庫剛剛創建時生成的,推測起來應該是空的。原因非常簡單:當數據庫存儲數據時,它不僅創建一個新的文件,還會將數據轉儲到該文件中。由于性能原因(并滿足 ACID 測試),數據庫將數據分攤到許多文件中。數據在寫入文件時具有特定的結構,稱為頁面。數據頁面的內容包括頁面上的數據和有關頁面上數據的信息(有時稱為元數據)。通過在數據庫首次創建時生成所有這些文件(和文件中的頁面),數據庫可以開始盡快地存儲數據。





回頁首


ij 工具

ij 工具功能十分強大??捎盟ㄔ趯淼奈恼轮校﹫绦蟹秶鷱V泛的操作,包括創建數據庫(如前所述)和在數據庫內創建新項。ij 工具包括一個 help 命令,可以列出和描述要使用的一些常見命令,如 清單 3 所示。注意,為了適應空間限制,該清單已被重新格式化,所以您的版本看起來可能稍有不同。


清單 3. 獲得 ij 工具的幫助
rb$ java org.apache.derby.tools.ij
            ij version 10.1
            ij> help ;
            Supported commands include:
            PROTOCOL 'JDBC protocol' [ AS ident ];
            -- sets a default or named protocol
            DRIVER 'class for driver';   -- loads the named class
            CONNECT 'url for database' [ PROTOCOL namedProtocol ]
            [ AS connectionName ];
            -- connects to database URL
            -- and may assign identifier
            SET CONNECTION connectionName; -- switches to the specified
            connection
            SHOW CONNECTIONS;            -- lists all connections
            AUTOCOMMIT [ ON | OFF ];     -- sets autocommit mode for the
            -- connection
            DISCONNECT [ CURRENT | connectionName | ALL ];
            -- drop current, named, or all
            -- connections; the default is CURRENT
            COMMIT;                      -- commits the current transaction
            ROLLBACK;                    -- rolls back the current transaction
            PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text
            EXECUTE { name | 'SQL-J text' } [ USING { name | 'SQL-J text' } ] ;
            -- executes the statement with
            -- parameter values from the USING
            -- result set row
            REMOVE name;                 -- removes the named previously
            -- prepared statement
            RUN 'filename';              -- run commands from the named file
            ELAPSEDTIME [ ON | OFF ];    -- sets elapsed time mode for ij
            MAXIMUMDISPLAYWIDTH integerValue;
            -- sets the maximum display width for
            -- each column to integerValue
            ASYNC name 'SQL-J text';     -- run the command in another thread
            WAIT FOR name;               -- wait for result of ASYNC'd command
            GET [SCROLL INSENSITIVE] CURSOR name AS 'SQL-J query';
            -- gets a cursor (JDBC result set)
            -- on the query
            -- SCROLL cursors are only available
            -- in JDBC 2.0 and higher.
            -- (Cursor scroll type is ignored in
            -- JDBC 1.X.)
            NEXT name;                   -- gets the next row from the
            -- named cursor
            FIRST name;                  -- gets the first row from the
            -- named scroll cursor
            LAST name;                   -- gets the last row from the
            -- named scroll cursor
            PREVIOUS name;               -- gets the previous row from the
            -- named scroll cursor
            ABSOLUTE integer name;       -- positions the named scroll cursor
            -- at the absolute row number
            -- (A negative number denotes
            -- position from the last row.)
            RELATIVE integer name;       -- positions the named scroll cursor
            -- relative to the current row
            -- (integer is number of rows)
            AFTER LAST name;             -- positions the named scroll cursor
            -- after the last row
            BEFORE FIRST name;           -- positions the named scroll cursor
            -- before the first row
            GETCURRENTROWNUMBER name;    -- returns the row number for the
            -- current position of the named
            -- scroll cursor (0 is returned when
            -- the cursor isn't positioned
            -- on a row.)
            CLOSE name;                  -- closes the named cursor
            LOCALIZEDDISPLAY [ ON | OFF ];
            -- controls locale sensitive data
            -- representation
            EXIT;                        -- exits ij
            HELP;                        -- shows this message
            Any unrecognized commands are treated as potential SQL-J commands
            and executed directly.
            ij>
            

清單 3 所示的大多數命令似乎都很陌生,當然啦,您還剛開始學習 Apache Derby。

還可以使用 ij 工具與數據庫建立多個連接,如 清單 4 所示。


清單 4. 用 ij 工具建立連接
ij> connect 'jdbc:derby:test;create=true' ;
            WARNING 01J01: Database 'test' not created,
            connection made to existing database instead.
            ij> connect 'jdbc:derby:test' ;
            ij(CONNECTION1)> show connections ;
            CONNECTION0 -   jdbc:derby:test
            CONNECTION1* -  jdbc:derby:test
            * = current connection
            ij(CONNECTION1)> disconnect ;
            ij> show connections ;
            CONNECTION0 -   jdbc:derby:test
            No current connection
            ij> set connection CONNECTION0 ;
            ij> show connections ;
            CONNECTION0* -  jdbc:derby:test
            * = current connection
            ij> exit ;
            

本例首先嘗試使用原始的 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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97