??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲第一偷拍网,亚洲国产激情,亚洲精品成人久久久998http://www.aygfsteel.com/hxweb/category/20088.htmlJSP、JAVA、struts、hibernate、spring、eclipse、工作流、电(sh)子政?/description>zh-cnWed, 28 Feb 2007 03:16:40 GMTWed, 28 Feb 2007 03:16:40 GMT60Java 目中应用Subversion配置与管理(转)http://www.aygfsteel.com/hxweb/articles/99896.html好学蜘蛛好学蜘蛛Thu, 15 Feb 2007 00:30:00 GMThttp://www.aygfsteel.com/hxweb/articles/99896.htmlhttp://www.aygfsteel.com/hxweb/comments/99896.htmlhttp://www.aygfsteel.com/hxweb/articles/99896.html#Feedback0http://www.aygfsteel.com/hxweb/comments/commentRss/99896.htmlhttp://www.aygfsteel.com/hxweb/services/trackbacks/99896.htmlJava 企业U项目中应用Subversion的配|与理
--JavaSVN + Subversion跟踪数据变化历史

译者:(x)陈v?http://www.chq.name)

    企业最重要的资产应该是数据信息Q但现在的企业应用除了需要存储数据外Q还l常要求跟踪数据变化整个q程Qƈ?x)扩展到一pd相关的要求,如数据变化的原因、变化的旉{,而且在许多情况下是对以文档Ş式存储的数据q行跟踪。用SubVersion可以满q些貌似普通但实际上很复杂的要?br />
版权声明QQ何获?/span>Matrix授权的网站,转蝲时请务必保留以下作者信息和链接
作?陈v?http://www.chq.name);michaelzyy
原文:http://www.matrix.org.cn/resource/article/2007-02-05/Subversion_ba84f1b9-b4b0-11db-b1a9-1f2330fc56f8.html
关键?Java;Subversion

来自数据的挑?/b>

    企业应用存储了关键数据,而且应用E序q不仅限于对数据q行插入、读取、更新和删除操作Q即CRUDQ,应用E序q期望能够存储数据更改的历史记录。此外,企业按照一pd的业务或者规定的要求Q不但要求存储数据资产更改结果的历史Q而且要求存储是谁Q在什么时候,因ؓ(f)什么原因,如何改变了数据等{诸如此cȝ跟踪信息?br />
    应用数据的Ş式和寸也有很多变数Q既有简单数据,如字W串和数字型Q也有复杂的cdQ如使用Blob或Cblobcd来存储文档。典型的应用E序要处理大量的上传l程序处理的以文档Ş式存储的数据Q如果用传统的历史表{方式来跟踪诸如复杂cd的文档的变化Q简直就是做一场恶梦?br />
使用历史表进行跟t?/b>

    关系数据库是存储数据的首选,可以高效地组l、存储、检索数据信息,׃应用E序数据存攑֜关系数据库中Q当然就理成章的尝试用它来存放历史跟踪数据Q一般是使用带有旉戳的数据表来存放所有的重要数据表。在更新主表的时候会(x)把旧数据推入历史表中Q这个过E一般是通过触发器或由应用程序自己来完成?br />
使用历史表存储历史信息,?x)存在以下问题?x)
+关系型数据库和关pL型会(x)提高数据存储和检索的效率Q但是历史表昄不适合使用关系型数据库?br />+数据库不支持版本控制。应用程序不得不使用触发器或其它定制的技术来仔细的存放数据(Q以便实现版本控制功能)?br />+必须由应用程序亲自检版本之间的变化Q从历史表中索历史数据进行互相比较?br />
    关系数据库依旧是存储和检索业务数据的仓库Q它们擅长于理数据。以上列丄~点仅限于用关系数据模型存储多个不同的版本的数据q进行历史数据跟t的情况下?br />
Subversion ?JavaSVN

    Subversion是一个可以代替CVSQ一个传l的版本控制pȝQ的版本控制pȝ。Subversion使用UC仓库的树(wi)状结构来存储文g和目录。Subversion?x)跟t对仓库中信息的所有改变,它具有一个中央仓库,允许q行q发更新Q允?dng)R过http或https使用WebDAV协议来访问仓库,可以避免使用q程中的防火墙的q扰。Subversion的理念就是“拷?~辑-合ƈ”,q就意味着在修Ҏ(gu)不需要锁定被修改的对象?br />
    Q译者注Q关于WebDAVQ是Web-based Distributed Authoring and Versioning的羃写,是一个标准HTTP协议的扩展,通过web技术把目录和文件作为可M的对象进行共享读写,把web变成一个可d的媒体。RFCs2518?253描述了WebDAV/DeltaV 对于HTTP的扩展,|址http://www.webdav.org/。)

    JavaSVN是一个纯Java的Subversion客户端类库,提供与Subversion交互的基于JavaE序的应用程序接?API), JavaSVN既提供了q行直接dSubversion仓库的底层接口,也提供了从Subversion仓库出工作拷贝的高层接口?br />
    现在Q应用程序可以用结合了关系型数据库和Subversion的方式来满数据存储和变化跟t的需求了Q对数据库的更新同时?x)将变化情况提交到Subversion中,Subversion是记录变化的主要数据源Q关pL据库则用于除此以外所有的其他存储。这样做q有一个优势,׃Subversion使用“拷?~辑-合ƈ”模式,q样每次从关pL据库中检索数据时不再要求锁定目标表了?br />

实例学习(fn)

    现在让我们来定一下要解决的问题和解决Ҏ(gu)Qƈ使用实例来说明如何用Subversion 和JavaSVN。我们用JavaSVN一个简单的领域对象存储到Subversion 中,索以前的版本Qƈ昄两个版本的差异。我们示例的领域对象是以下所C的h数据。在本文l尾的“资源”部分有完整的源代码链接?br />

public class LoanData extends BaseTrackingObject {
        private String loanId;
        private double loanAmount;
        private float  loanRate;
        private int    loanTerm;
        ......
        ......
}



    在这里,使用抽象的BaseTrackingObjectcL定义通用的跟t数据,如修改用戗修Ҏ(gu)期、修改原因等。其中定义了讄和取得objectId抽象Ҏ(gu)Q把它用作主键来讉K领域对象Q定义了一个命名ؓ(f)getXmlRepresentation的工h法,用于把对象{换成XML格式Q进而用于在Subversion中存储和索数据?br />
初始化JavaSVN

    SVNManagercL通向Subversion的\由,用于在不使用工作拯的情况下Q通过底层JavaSVN接口直接讉KSubversion仓库Q通过初始化JavaSVNcd来可以用HTTP(S)或SVN(S)与Subversion仓库q行交互。在q里Q我们选择使用HTTP (WebDAV)Q因为可以减在处理防火墙方面的工作?br />
    库的初始化工作要首先调用的是Ҏ(gu)DAVRepositoryFactory.setup()。SVNRepositorycd含了所有直接访问Subversion仓库的方法,Subversion仓库?wi)状l构的根路径提供lSVNRepositoryFactorycdQ就完成了这个类的初始化Q而ISVNAuthenticationManagercȝ作用是向SVNRepository提供讉KSubversion仓库的授权信息?br />

public void initRepository() {
        //initialize the system to work over http
        DAVRepositoryFactory.setup();
        ............
        //point to the root folder of repository
        SVNURL svnUrl = SVNURL.parseURIEncoded
                        ("http://localhost/repos/");
        //initialize the SVNRepository
        theRepository = SVNRepositoryFactory.
                        create(svnUrl);
        //Creates the Auth manager with our user
        //and password credentials
        ISVNAuthenticationManager authManager =
                new BasicAuthenticationManager
                (name, password);
        //provides the credentials to the
        //SVNRepository
        theManager.setAuthenticationManager
                (authManager);
        ........
}

在Subversion中存储数?/b>

    Subversion需要用层ơ结构存储数据,q样我们先要讑֮一下领域实体的层次l构Q这里用一个命名ؓ(f)“DomainObjects”的文gҎ(gu)存放领域数据。领域对象类会(x)这个目录下存放领域对象的所有子目录Q而每个独立的域对象被以XML格式q行存储Qƈ以其主键q行命名?br />
    为存储LoanData域对象,我们先要执行SVNManager对象的checkInObjectҎ(gu)Q通过SVNRepository 执行的ISVNEditor对象来在Subversion仓库中的建立和更新域对象的版本,但只有在closeEdit被调用后Q才?x)提交所有的操作。SVNDeltaGeneratorcȝ于获取当前版本与被更新版本之间的差异QSubversion通过存储版本间差异部分的形式存放新的版本Q这样会(x)使提高网l效率?br />

public SVNResult checkInObject(
                BaseTrackingObject obj){
        .....
        //Obtain the editor handle from the
        //repository
        ISVNEditor editor = theRepository.
                getCommitEditor(obj.
                getModificationReason(), null);
        ....
        //create the file at the specified path
                editor.addFile(path, null, -1);
        }
        else {
                //file is already present, so open
                //the file in the repository
                editor.openFile(path, -1);
        }
        ....
        String checksum = deltaGenerator.
                        sendDelta(path,
                        new ByteArrayInputStream(
                        obj.getXmlRepresentation().
                        getBytes()),
                        editor, true);
        .....
        editor.closeEdit();
        ...
}



索变化历?/b>

    为检索指定领域对象的历史版本Q需要调用SVNManagercȝgetRevisionLogҎ(gu)Q?SVNRepositorycȝgetLatestRevisionҎ(gu)可以得到当前版本PSVNManager.logҎ(gu)可以索每个版本的日志Q日志可以包含版本修订的日期、修改h、修改的内容{信息;SVNManager.getFileҎ(gu)可以从Subversion仓库中取得领域对象指定版本的所有内宏V?br />

public List getRevisionLog(BaseTrackingObject
        obj, long startRevision,
        long endRevision) {
        .....
        if(endRevision==-1) {
                //obtain the latest revision from
                //the repository
                endRevision =
                        theRepository.getLatestRevision();
        }
        //retrieve the various log entries for
        //the particular object path
        Collection revisionLogs = theRepository.
                log(new String[] {path}, null,
                        startRevision, endRevision,
                        false, true);
        ....
        //Obtain the contents of the object at
        //the specified revision
        theRepository.getFile(path, revisionInfo.
                getRevisionNumber(),
                new Properties(),
                xmlFileContentsStream);
        ....
}

索版本间的差?/b>

    SVNManager.showDifferencesҎ(gu)用来两个版本之间的差异Q是通过调用JavaSVN 的SVNDiffManagercLȝ差异Q也可以通过SVNClientManager来引用ƈ执行q个c,SVNDiffManager的doDiffҎ(gu)有一个默认的实现Q可以通过参数指定输出参数的形式取得固定格式的差异结果,我们也可以用ISVNEditor来实C个自q差异比较Ҏ(gu)。在q个例子里,我们使用默认的实现?br />

public String showDifferences(
                BaseTrackingObject obj,long revision1,
                long revision2) {
        ....
        //Create an instance of SVNClientManager
        //providing authentication
        SVNClientManager ourClientManager =
                        SVNClientManager.newInstance(
                        options, "name", "password");
        //Obtain the handle to DiffClient
        //from the client manager
        SVNDiffClient theDiff = ourClientManager
                        .getDiffClient();
        ....
        theDiff.doDiff(svnUrl, SVNRevision.
                create(revision1), svnUrl,
                SVNRevision.create(revision2),
                false, false, diffStream);
        ....
}



l论

    在企业应用里,不但要完成数据的存储和检索,q要实现Ҏ(gu)据变化历史的跟踪。传l方法是使用关系数据库来完成q个工作Q但是这不是一个“优雅”的Ҏ(gu)。在我们的贷ƾ数据处理的例子里,Subversion提供了跟t数据变化的支持。JavaSVN的API用来完成数据存储、检索、获取版本间差异和日志等d?br />我们的例子只是一个简单的性能演示QSubversion提供了丰富的功能支持Q完全可以应用于企业U应用。祝你探索地更开心!

资源
+本文?a target="_new">范例代码和相关的安装介绍
+Matrix JavaC֌:http://www.matrix.org.cn
+在www.chq.name也可以得到部分相兌源和信息

关于作?/b>
Swaminathan Radhakrishnan works as a senior technical architect for Infosys Technologies, Ltd.
Swaminathan Radhakrishnan 本文作者,Infosys技术有限公司的资深技术架构师

陈v?joson)Q本文译者,生活在中国的׃省烟台市Q先后从事Y件开发、数据库理、系l管理等工作Q?001q获得高U程序员资格?br />



好学蜘蛛 2007-02-15 08:30 发表评论
]]>
վ֩ģ壺 | ͻȪ| | ̶| | | ۳| Ҵ| | ¡Ң| Դ| | ǭ| | º| | Ϫ| | | | Ͽ| | | ͨ| | | | | | ĵ| ƽ| ͬ| | ư| | ʹ| | º| ͨ| | ³|