<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Open-Source World

    let's learn and study.
    posts - 28, comments - 23, trackbacks - 0, articles - 1

    Derby入門 —— (2)

    Posted on 2007-09-04 11:10 tearofmoscow 閱讀(614) 評論(1)  編輯  收藏
    自動層疊刪除
           現(xiàn)在你有超過一萬條的定單數(shù)據(jù),你需要保證這些在數(shù)據(jù)庫里的數(shù)據(jù)沒有被破壞。固定這些數(shù)據(jù)是毫無疑問的。
           讓我舉例說明一個潛在的問題,這個問題的中心是圍繞在刪除一個顧客后。問題就有可能會出現(xiàn)。
           使用標準的SQL語句,只從custs表中刪除顧客信息:
    delete from custs where id='838';
     
           這是從數(shù)據(jù)庫中刪除顧客編號為838的消費者。好極了!
           如果這是你所做的,數(shù)據(jù)庫的數(shù)據(jù)正式被破壞了。為什么呢?這是因為在數(shù)據(jù)庫里有10定單信息沒有關聯(lián)到消費者!
           這可能引起應用程序各種各樣的錯誤。所有應用程序取得定單信息并嘗試打印顧客信息時,都會涉及到這個異常。當你列出所有用戶和他們的定單信息時,有些定單信息永遠都不會顯示出來。
           在關系數(shù)據(jù)庫管理系統(tǒng)的條款中,數(shù)據(jù)庫引用完整性是不允許這樣的情況的。這是因為一條顧客記錄被刪除,而沒有刪除相應的定單信息。
           因此,我們需要這樣做:
    delete from custs where id='838';
    delete from orders where custid='838';
     
           而且,我們需要確保兩條刪除命令在同一個事務中執(zhí)行。要么兩條語句都執(zhí)行成功,要么都執(zhí)行失敗。
           這個稱為刪除層疊,因為刪除顧客記錄導致刪除定單信息。
           Derby有能力處理引用完整性。
     
    Derby觸發(fā)器
           保證引用完整性的方法是定義一個觸發(fā)器。一個觸發(fā)器是一段代碼或SQL語句,當數(shù)據(jù)發(fā)生修改或存取時,它將在數(shù)據(jù)庫服務器里執(zhí)行。Derby支持定義觸發(fā)器(使用SQL語句或Java代碼),當顧客記錄被刪除時,可以編碼實現(xiàn)刪除關聯(lián)的定單信息。然而,在Derby里有一個更簡單的方法。
           它可以告訴Derby,使用標準的SQL DDL(數(shù)據(jù)定義)語句,這涉及到orders表和custs表。你也可以告訴Derby去完成自動層疊刪除。
     
    添加參考約束
           要添加自動層疊刪除,就要修改原始的createdb.sql里的語句。在db\ref子目錄下找到createdbref.sql文件。你需要對orders表定義進行修改。添加下面蘭色字體的內(nèi)容:
    create table orders
           (id char(8) not null,
           custid char(5) not null
           references custs (id) on delete
           cascade, total integer,
           primary key(id,custid));
           另外一個不同是連接數(shù)據(jù)庫的URL值。這時,網(wǎng)絡驅(qū)動器是指定的。一定要注意網(wǎng)絡驅(qū)動器是需要用戶名和密碼的,默認的用戶名和密碼都是APP,所以URL值將修改為:
    connect 'jdbc:derby:net://localhost/
           vsjdb:user=APP;password=APP;';
     
           你現(xiàn)在可以強行創(chuàng)建帶參考約束的新表。確保復制createdbref.sql到你的工作目錄。再次啟動ij。現(xiàn)在,使用下面的命令可以刪除所有記錄并創(chuàng)建新表:
    run 'createdbref.sql';
     
           在創(chuàng)建了表后,你可以再次運行TableFiller.java文件去在表中添加10000條定單數(shù)據(jù)。使用network子目錄的修改版本。在原始的TableFiller.java里修改的部分如下面蘭色字體顯示的:內(nèi)容:
    import java.sql.*;
    import java.util.Properties;
    public class TableFiller {
           Connection conn = null;
           PreparedStatement insertCust
                  = null;
           PreparedStatement insertOrder
                  = null;
           String driverName=
                  “com.ibm.db2.jcc.DB2Driver”;
           String url =
                  “jdbc:derby:net://localhost/
                  vsjdb:user=APP;password=APP;”;
           ...
     
           裝載的驅(qū)動器將要改為網(wǎng)絡驅(qū)動器(com.ibm.db2.jcc.DBDriver),URL值最好還是改成訪問網(wǎng)絡JDBC驅(qū)動器的值。否則,這個代碼將與原始的TableFill.java文件一樣。如果你要寫你自己的JDBC代碼,你可以設置一個string從外部文本文件里讀取參數(shù),這樣你將不需要修改代碼就能在嵌入式關系數(shù)據(jù)庫管理系統(tǒng)和網(wǎng)絡關系數(shù)據(jù)庫管理系統(tǒng)之間轉(zhuǎn)換。
     
    多用戶并發(fā)訪問
           現(xiàn)在,來關注多用戶連接,在另一個控制臺窗口啟動ij會話,并連接到服務器使用下面的命令:
    connect 'jdbc:derby:net://localhost/
           vsjdb:user=APP;password=APP;';
     
           在原始的控制臺窗口,編譯并運行新的TableFiller.java文件。這將創(chuàng)建1000個顧客記錄和10000條定單記錄。當這些操作執(zhí)行完畢后,回到新的ij窗口并使用下面的命令:
    select * from custs;
    …and:
    select * from orders;
     
           當你執(zhí)行這個命令的時候,你將發(fā)現(xiàn)所有用戶和定單信息都已經(jīng)被創(chuàng)建。網(wǎng)絡服務器允許多用戶并發(fā)訪問數(shù)據(jù)。
     
    測試層疊刪除
           一旦你創(chuàng)建了數(shù)據(jù)記錄,試著在ij里執(zhí)行下面的語句:
    select * from custs where id='700';
     
    接著執(zhí)行下面的語句:
    select * from orders where
                   custid='700';
     
           你將看到顧客記錄和這個顧客的10條定單信息。
           現(xiàn)在,嘗試刪除顧客,使用下面的命令:
    delete from custs where id='700';
     
           這將刪除用戶記錄,層疊將會刪除關聯(lián)的定單信息?,F(xiàn)在嘗試再次使用上面的select語句查看,你將發(fā)現(xiàn)那10條定單信息也被刪除了。
     
    寫一個Derby存儲過程
           在實驗的最后,你將用Java編程語言創(chuàng)建一個Derby存儲過程。你也可以存儲代碼到存儲過程進入Derby數(shù)據(jù)庫內(nèi)部,Derby能輕松的區(qū)分數(shù)據(jù)和代碼。
           該存儲過程將調(diào)用deleteAll(),從它的名字可以理解到,它將刪除數(shù)據(jù)庫里的所有記錄。在stored子目錄下可以找到實現(xiàn)該存儲過程的Java代碼,它的名字為CleanTables.java。代碼內(nèi)容如下:
    import java.sql.*;
    public class CleanTables {
                   public static void delAll ()
                                   throws SQLException {
                                   Connection conn =
                                   DriverManager.getConnection(
                                                  "jdbc:default:connection");
                                   Statement delCusts =
                                                  conn.createStatement();
                                   delCusts.executeUpdate(
                                                  "delete from custs");
                                   delCusts.close();
                                   conn.close();
                                   return;
                   }
    }
     
    你可以看到,該存儲程序在Java類里是一個public static的方法。JDBC連接器的內(nèi)容是代碼里url的值:
    jdbc:default:connection
    這會告訴Derby服務器提供一個默認的連接到代碼。Derby將管理這些連接。實際上的語句是執(zhí)行:
    delete from custs;
     
           自從層疊刪除生效,刪除custs表的任何數(shù)據(jù),也將刪除orders表里相關聯(lián)的數(shù)據(jù)。
     
    在Derby數(shù)據(jù)庫里存儲Java代碼
           要在Derby數(shù)據(jù)庫里存入Java代碼,你首先需要編譯該代碼并創(chuàng)建成JAR文件。編譯CleanTables.java代碼:
    javac CleanTables.java
     
           創(chuàng)建JAR文件:
    jar cvf vsjstproc.jar *.class
     
           或者你可以使用makejar.bat文件來完成上述操作,復制生成的vsjstporc.jar文件到工作目錄。
           在工作目錄,你需要設置該JAR文件到數(shù)據(jù)庫中。在ij中使用下面的命令(確保你的連接會話是通過網(wǎng)絡驅(qū)動器獲得的):
    call sqlj.install_jar('vsjstproc.jar',
                   'APP.cleanTable', 0);
     
           這個命令實際上是調(diào)用一個存儲過程,它將設置vsjstporc.jar文件到數(shù)據(jù)庫并為它設置是內(nèi)部名cleanTable。APP引用應用程序計劃。讓JAR文件在數(shù)據(jù)庫里是非常方便的。當你復制數(shù)據(jù)庫時,這些代碼將跟著被移動。
           如果你需要從數(shù)據(jù)庫里刪除該JAR文件,你可以使用:
    call sqlj.remove_jar(
                   'APP.cleanTable', 0);
     
           在刪除調(diào)用中僅僅需要內(nèi)部名。
           當把JAR設置到數(shù)據(jù)庫里后,當它需要讀取Java代碼時,你需要告訴Derby去識別該JAR文件。這些都需要通過存儲過程設置一個屬性:
    call syscs_util.syscs_set_database_
                   property('derby.database.
                   classpath', 'APP.cleanTable');
     
           當裝載Java類時,Derby都會查看內(nèi)部的APP.cleanTable JAR文件。你最后準備定義一個名為deleteAll()的存儲過程。使用下面的命令:
    create procedure deleteAll() parameter
                   style java language java modifies
                   sql data external name
                   'CleanTables.delAll';
     
           Derby將從APP.cleanTable JAR文件找到CleanTable類,并鎖定該類的static delAll()方法。如果你需要刪除該存儲過程,你可以使用下面的命令:
    drop procedure deleteAll;
     
           有了該存儲過程,你可以刪除這兩個表的所有數(shù)據(jù),只需要簡單的在ij下調(diào)用存儲過程deleteAll():
    call deleteAll();
     
           在這個存儲過程執(zhí)行完畢后,你將發(fā)現(xiàn)這兩個表是空的了。
     
    結(jié)論
           Derby是一個具有豐富特性的關系數(shù)據(jù)庫系統(tǒng),并能集成到你的項目中。
           它支持嵌入式模式和客戶端-服務器模式操作,它能適應部署多變的情況。它是100%用Java實現(xiàn)的,并與你的Java應用程序一樣的享受‘隨時發(fā)布’。它能快速執(zhí)行和處理大量數(shù)據(jù),同時也支持高級特性,例如引用完整性和存儲項目,它以達到理想化的持久化的數(shù)據(jù)存儲所必須的。最后但并不是最小,它自由的Apache許可讓你自由的綁定它到你的產(chǎn)品中。
    開源像礦山有很多隱藏的寶石一樣。如果你沒有再次關注Apache Derby,你將不會注意到有鉆石的存在。
     
    關于作者:
           Sing Li:顧問,培訓師和自由作家,他專攻Java,web應用程序,分布式計算和對等技術。他的最近出版包括Early Adopter JXTA,Perfessional JINIProfessional Apache Tomcat,這些都是Wrox出版社出版
     
    下載和安裝Derby
           你可以在incubator area of the Apache site里找到Derby
           一旦你解壓下載的Derby,注意你的解壓目錄,這是你的Derby安裝目錄。你需要使用這個目錄去設置的你的classpath。
     
    下載Derby JDBC的網(wǎng)絡驅(qū)動器
           為了在網(wǎng)絡模式下訪問Derby,你將需要一個JDBC網(wǎng)絡驅(qū)動器。IBM捐贈了這個驅(qū)動器給Derby項目,但是直到寫本文時,它都不是一個標準版本。
           暫時,你將需要下載IBM DB2 JDBC Universal driver for Apache Derby Network Server。根據(jù)地址里的說明去設置你的classpath 

    Feedback

    # re: Derby入門 —— (2)   回復  更多評論   

    2008-04-27 17:34 by arzhuo
    文章非常好,能將這個Derby這篇文章有關的源碼發(fā)給我嗎,謝謝!
    我的郵箱是: arzhuo@gmail.com

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲综合精品第一页| 国产精品亚洲片夜色在线| va亚洲va日韩不卡在线观看| 免费a级毛片视频| 亚洲国产精品国自产拍AV| 久久亚洲精品成人无码网站| 亚洲av无码电影网| 免费人成网上在线观看| 黄色网站软件app在线观看免费| 美女视频黄免费亚洲| 亚洲一区二区三区在线视频| 亚洲欧洲在线观看| 男男gay做爽爽免费视频| 一区二区三区观看免费中文视频在线播放 | 亚洲日本va一区二区三区| 两性色午夜免费视频| 91黑丝国产线观看免费| 亚洲综合色区在线观看| 最近免费mv在线观看动漫| 久久精品亚洲一区二区三区浴池 | 美女一级毛片免费观看| h片在线免费观看| 亚洲熟女一区二区三区| 亚洲av无码一区二区三区在线播放| 国内少妇偷人精品视频免费| 免费一级做a爰片性色毛片| igao激情在线视频免费| 日本无卡码免费一区二区三区| 中文字幕亚洲色图| 免费网站看v片在线香蕉| 亚洲精品中文字幕麻豆| 久久九九全国免费| 亚洲一区中文字幕在线观看| 国产精品免费一级在线观看| 国产成人精品日本亚洲直接 | 亚洲一区二区精品视频| 91福利视频免费| 亚洲国产精品VA在线观看麻豆| 91精品免费在线观看| 无码AV动漫精品一区二区免费| 免费高清在线影片一区|