• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 用 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.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>