• <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-5-24 22:43 | 作者: Robert Brunner | 來源: IBM | 查看: 255次 | 進入軟件測試論壇討論

    領測軟件測試網 想要立刻開始使用 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       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/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品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>