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

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

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

    如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

    CowNew開源團(tuán)隊(duì)

    http://www.cownew.com 郵件請聯(lián)系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

    工廠方法模式
       
    以可移植的、可擴(kuò)展的方式來生成流水號EJB應(yīng)用中的一個(gè)難點(diǎn)。 現(xiàn)在比較成熟的流水號生成策略有全局唯一標(biāo)識(即UUID)和使用數(shù)據(jù)庫內(nèi)置流水號生成策略。全局唯一標(biāo)識有單件模式、根據(jù)網(wǎng)絡(luò)標(biāo)識(Mac地址+IPJVM唯一對象標(biāo)識)等策略。不同的數(shù)據(jù)庫也有不同的流水號生成策略:例如Oracle采用內(nèi)置流水號產(chǎn)生機(jī)制,SQL Server則采用Identity機(jī)制。這給我們帶來方便的同時(shí)也使得應(yīng)用程序在不同系統(tǒng)之間移植變得很麻煩。我采用工廠方法模式解決這個(gè)問題。
      
    結(jié)構(gòu)圖


    我們首先定義一個(gè)基類接口,它定義了各種唯一序列生成器的共同的方法。
    abstract public interface SequenceCreator {
      abstract public String getSequenceId(String aId);
      abstract public Integer getSequenceAsInt(String aId);
    }
     
    兩個(gè)函數(shù)的參數(shù)aId是不同流水號生成標(biāo)識。getSequenceId是產(chǎn)生以字符串形式返回的流水號,getSequenceAsInt是以整形形式返回流水號。為了防止無謂的重復(fù),下面的實(shí)例中我們將只寫各個(gè)方法的getSequenceId實(shí)現(xiàn)。

    1)我們首先看SQLSequenceCreator的實(shí)現(xiàn)代碼

        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

        Connection con = java.sql.DriverManager.getConnection("jdbc:odbc:DNSEJB");

        CallableStatement cs = con.prepareCall("{call SetIndex(?,?,?)}");

        cs.registerOutParameter(2,Types.VARCHAR);

        cs.setString(1,aId);

        cs.setInt(3,10);

        cs.executeUpdate();

        String str= cs.getString(2);

        return str.substring(aId.length(), str.length());

    我們是調(diào)用我們自定義的存儲(chǔ)過程來生成流水號的,存儲(chǔ)過程的代碼請參看代碼。

    2Oracle的實(shí)現(xiàn)代碼

    String strSQL = "select " + sequence_name + ".nextval from DUAL";

        Statement  stmt = conn.createStatement();

        ResultSet rs = stmt.executeQuery(strSQL);

        rs.next();

    return rs.getString(1);

    Oracle對流水號生成提供了比較好的支持,而且Oracle的生成策略也比SQLServer更高效,消耗更少的資源,資源鎖定情況也比SQLServer少。

    3

    UUID的實(shí)現(xiàn)代碼

    InetAddress inet = InetAddress .getLocalHost();

    Byte[] bytes = inet.getAddress();

    String hexInetAddress = hexFormat(getInt(bytes),8);

    String thisHashCode=hexFormat(System.identityHashCode(this),8);

    MideValue = hexInetAddress+thisHashCode;

    Seeder = new SecureRandom();

    In node = seeder.nextInt();

    Long timeNow = System.currentTimeMillis();

    Int timeLow = (int)timeNow&oxFFFFFFF;

    Int  node = seeder.nextInt();

    Return (hexFormat(timeLow,8)+mid+hexFormat(node,8));

        UUID是一個(gè)基于字符串的主鍵,他有一下字符串組合而成:利用System.currentTimeMillis()精確道毫秒的唯一、IP地址的十六進(jìn)制標(biāo)識、利用System.identityHashCode(this)得到的一個(gè)JVM內(nèi)部的唯一地址標(biāo)識和利用隨機(jī)數(shù)生成器生成隨機(jī)數(shù)。

     

    還有很多不同的流水號生成策略,我們不準(zhǔn)備一一羅列。我們的主要問題是要解決在采用不同的序列生成策略時(shí)將代碼的修改減到最小。

    我們定義的SequenceCreator 類定義了所有流水號生成策略公共的方法,并且把這些方法定義為虛方法,在不同的流水號生成策略代碼中只要覆蓋這些方法即可。序列號生成器工廠類SequenceCreatorFactory getSquenceCreator()并不返回具體的流水號生成類,而是返回SequenceCreator,這樣當(dāng)采用不同策略時(shí)只要修改getSquenceCreator方法即可。

    posted on 2006-03-11 00:11 CowNew開源團(tuán)隊(duì) 閱讀(3020) 評論(1)  編輯  收藏

    評論

    # re: 工廠方法模式解決流水號生成問題 2006-03-11 11:37 Parker
    org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer  回復(fù)  更多評論
      


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲va乱码一区二区三区| 亚洲韩国在线一卡二卡| 国产成人aaa在线视频免费观看 | 亚洲中文字幕乱码熟女在线| 亚洲永久网址在线观看| 噼里啪啦免费观看高清动漫4| 国产高清视频在线免费观看| 亚洲无线观看国产精品| 亚洲国产成人精品无码区在线网站| 新最免费影视大全在线播放| 免费在线中文日本| 成年女人喷潮毛片免费播放| 亚洲宅男天堂在线观看无病毒| 亚洲国产模特在线播放| 日韩免费精品视频| 亚洲中文字幕无码久久2020| 午夜a级成人免费毛片| 亚洲阿v天堂在线| 亚洲AV无码成人专区片在线观看 | 亚洲中文无码永久免费| 久久99亚洲综合精品首页| 亚洲一级毛片视频| 麻豆国产VA免费精品高清在线| 亚洲乱码中文字幕在线| 91在线手机精品免费观看| www.亚洲色图.com| 亚洲成av人片在线看片| 九九精品成人免费国产片| 亚洲成年人啊啊aa在线观看| 亚洲人配人种jizz| 3344免费播放观看视频| 亚洲精品~无码抽插| 九九视频高清视频免费观看| 国产精品成人免费视频网站京东| 日木av无码专区亚洲av毛片| 一区二区免费在线观看| 亚洲一区中文字幕久久| 日本免费人成黄页在线观看视频| 一日本道a高清免费播放| 亚洲综合在线成人一区| 午夜影院免费观看|