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

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

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

    春風博客

    春天里,百花香...

    導航

    <2007年11月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    統計

    公告

    MAIL: junglesong@gmail.com
    MSN: junglesong_5@hotmail.com

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    使用XML作為持久存儲介質的解決方案續(xù)

    本文是"使XML作為持久存儲介質的解決方案 "的續(xù)文.

    上文中對成員的CRUD都采用同步進行資源保護,這種方案實際上是保護過度,帶來的消極影響是降低了程序的效率,在下面的例子中,我們應該使用讀寫鎖對資源進行保護.關于讀寫鎖的分析請見"讀寫鎖的OO分析(http://m.tkk7.com/sitinspring/archive/2007/10/21/154652.html)".

    下面是代碼:

    MemberService類:
    package com.sitinspring.model.service;

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Hashtable;
    import java.util.Iterator;
    import java.util.List;

    import org.apache.log4j.Logger;

    import com.sitinspring.exception.PersistFileReadException;
    import com.sitinspring.exception.PersistFileWriteException;
    import com.sitinspring.model.domain.Member;
    import com.sitinspring.model.domain.MemberFilter;
    import com.sitinspring.model.persistence.Db4OPersistence;
    import com.sitinspring.model.persistence.HibernatePersistence;
    import com.sitinspring.model.persistence.Persistence;
    import com.sitinspring.model.persistence.SqlPersistence;
    import com.sitinspring.model.persistence.XmlPersistence;
    import com.sitinspring.util.ReadWriteLock;

    public class MemberService {
        
    private static Logger logger = Logger.getLogger(MemberService.class);
        
        
    private Persistence persistence;
        
    private Persistence xmlPersistence;
        
    private Persistence sqlPersistence;
        
    private Persistence db4OPersistence;
        
    private Persistence hibernatePersistence;

        
    private Hashtable<String, Member> members;

        
    private ReadWriteLock lock;

        
    public MemberService() {
            members 
    = new Hashtable<String, Member>();
            lock 
    = new ReadWriteLock();                
        }

        
        
    public void setPersistenceType(String type){
            logger.info(
    "指定持久層為"+type);
            
            
    if(type.equals("Xml")){                
                
    if(xmlPersistence==null){
                    
    try{
                        xmlPersistence
    =new XmlPersistence();
                    }

                    
    catch(Exception ex){
                        logger.error(
    "不能初始化XmlPersistence,原因:"+ex.getMessage());
                    }
                
                }

                
                persistence
    =xmlPersistence;                
            }
        
            
    else if(type.equals("Sql")){
                
    if(sqlPersistence==null){
                    
    try{
                        sqlPersistence
    =new SqlPersistence();
                    }

                    
    catch(Exception ex){
                        logger.error(
    "不能初始化XmlPersistence,原因:"+ex.getMessage());
                    }
                
                }

                
                persistence
    =sqlPersistence;            
            }

            
    else if(type.equals("Hibernate")){
                
    if(hibernatePersistence==null){
                    
    try{
                        hibernatePersistence
    =new HibernatePersistence();
                    }

                    
    catch(Exception ex){
                        logger.error(
    "不能初始化XmlPersistence,原因:"+ex.getMessage());
                    }
                
                }

                
                persistence
    =hibernatePersistence;            
            }

            
    else{
                
    if(db4OPersistence==null){
                    
    try{
                        db4OPersistence
    =new Db4OPersistence();
                    }

                    
    catch(Exception ex){
                        logger.error(
    "不能初始化XmlPersistence,原因:"+ex.getMessage());
                    }
                
                }

                
                persistence
    =db4OPersistence;            
            }

            
            
    try{
                members.clear();
                members
    =persistence.loadMemberFromPersistence();
            }

            
    catch(PersistFileReadException ex){
                logger.error(
    ""+persistence+"中讀取失敗");
            }

        }


        
    public boolean hasMember(String name) {
            
    return members.containsKey(name);
        }


        
    public boolean hasMember(Member member) {
            
    return hasMember(member.getName());
        }


        
    public boolean add(Member member) throws PersistFileWriteException {
            
    if (hasMember(member)) {
                System.out.println(
    "Member:" + member.getName()
                        
    + " has been exist!");
                
    return false;
            }
     else {
                
    try {
                    lock.writeLock();
                    persistence.add(member);
                    members.put(member.getName(), member);
                    
    return true;
                }
     finally {
                    lock.writeUnlock();
                }

            }

        }


        
    public boolean update(Member member) throws PersistFileWriteException {
            
    if (hasMember(member)) {
                
    try {
                    lock.writeLock();

                    persistence.update(member);

                    Member oldMember 
    = members.get(member.getName());
                    oldMember.setTitle(member.getTitle());
                    oldMember.setAge(member.getAge());

                    
    return true;
                }
     finally {
                    lock.writeUnlock();
                }


            }
     else {
                System.out.println(
    "Member:" + member.getName()
                        
    + " can't been found!");
                
    return false;
            }

        }


        
    public boolean saveOrUpdate(Member member) throws PersistFileWriteException {
            
    if (hasMember(member)) {
                
    return update(member);
            }
     else {
                
    return add(member);
            }

        }


        
    public boolean delete(Member member) throws PersistFileWriteException {
            
    return delete(member.getName());
        }

        
        
    public boolean delete(String memberName) throws PersistFileWriteException {
            
    if (hasMember(memberName)) {
                
    try {
                    lock.writeLock();
                    persistence.delete(memberName);
                    members.remove(memberName);
                    
    return true;
                }
     finally {
                    lock.writeUnlock();
                }

            }
     else {
                System.out.println(
    "Member:" + memberName
                        
    + " can't been found!");
                
    return false;
            }

        }


        @SuppressWarnings(
    "unchecked")
        
    public List<Member> search(MemberFilter memberFilter) {
            List
    <Member> retval = new ArrayList<Member>();

            
    try {
                lock.readLock();

                
    for (Iterator it = members.keySet().iterator(); it.hasNext();) {
                    String key 
    = (String) it.next();
                    Member member 
    = members.get(key);

                    
    if (memberFilter.match(member)) {
                        retval.add(member);
                    }

                }

            }
     finally {
                lock.readUnlock();
            }


            Collections.sort(retval);

            
    return retval;
        }


        
    public List<Member> getAll() {
            MemberFilter filter 
    = new MemberFilter() {
                
    public boolean match(Member member) {
                    
    return true;
                }

            }
    ;

            
    return search(filter);
        }


        
    public Member getMemberByName(String name) {
            
    try {
                lock.readLock();
                
    for (Iterator it = members.keySet().iterator(); it.hasNext();) {
                    String key 
    = (String) it.next();
                    Member member 
    = members.get(key);

                    
    if (member.getName().equals(name)) {
                        
    return member;
                    }

                }

            }
     finally {
                lock.readUnlock();
            }


            
    return null;
        }


    }

    XmlPersistence類代碼:
    package com.sitinspring.model.persistence;

    import java.io.File;
    import java.io.FileWriter;
    import java.util.Hashtable;
    import java.util.Iterator;
    import java.util.List;

    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;

    import com.sitinspring.exception.PersistFileReadException;
    import com.sitinspring.exception.PersistFileWriteException;
    import com.sitinspring.model.domain.Member;
    import com.sitinspring.util.FileDirUtil;

    public class XmlPersistence extends Persistence {
        
    private Document document;

        
    public XmlPersistence() throws PersistFileReadException,
                PersistFileWriteException 
    {
            filePos 
    = "member.xml";

            
    if (FileDirUtil.isFileExist(filePos) == false{
                
    // Create document when file not exist
                createDocument();
                
    return;
            }
     else {
                
    // Get Docunent when file exist
                SAXReader reader = new SAXReader();

                
    try {
                    document 
    = reader.read(new File(filePos));
                }
     catch (Exception ex) {
                    
    throw new PersistFileReadException(ex.getMessage());
                }

            }

        }

        
        
    public String toString(){
            
    return "XML存儲介質,文件為:"+filePos;
        }


        
    private void createDocument() throws PersistFileWriteException {
            String text 
    = "<members></members>";

            
    try {
                document 
    = DocumentHelper.parseText(text);
                writeDocumentToFile();
            }
     catch (PersistFileWriteException ex) {
                
    throw ex;
            }
     catch (Exception ex) {
                ex.printStackTrace();
            }

        }


        
    private void writeDocumentToFile() throws PersistFileWriteException {
            
    try {
                XMLWriter writer 
    = new XMLWriter(new FileWriter(filePos));
                writer.write(document);
                writer.close();
            }
     catch (Exception ex) {
                
    throw new PersistFileWriteException(ex.getMessage());
            }

        }


        
    public Hashtable<String, Member> loadMemberFromPersistence()
                
    throws PersistFileReadException {
            
    try {
                Hashtable
    <String, Member> retval = new Hashtable<String, Member>();

                List nodes 
    = document.getRootElement().elements("member");

                
    for (Iterator it = nodes.iterator(); it.hasNext();) {
                    Element elm 
    = (Element) it.next();
                    Member member 
    = new Member(elm.attributeValue("name"), elm
                            .elementText(
    "age"), elm.elementText("title"));
                    retval.put(member.getName(), member);
                }


                
    return retval;
            }
     catch (Exception ex) {
                
    throw new PersistFileReadException(ex.getMessage());
            }

        }


        
    public boolean add(Member member) throws PersistFileWriteException {
            
    try {
                Element rootElm 
    = document.getRootElement();
                Element newMemberElm 
    = rootElm.addElement("member");

                newMemberElm.addAttribute(
    "name", member.getName());

                Element ageElm 
    = newMemberElm.addElement("age");
                ageElm.setText(member.getAge());
                
                Element titleElm 
    = newMemberElm.addElement("title");
                titleElm.setText(member.getTitle());

                writeDocumentToFile();

                
    return true;
            }
     catch (PersistFileWriteException ex) {
                
    throw ex;
            }

        }


        
    public boolean update(Member member) throws PersistFileWriteException {
            
    try {
                Element rootElm 
    = document.getRootElement();
                List nodes 
    = rootElm.elements("member");

                
    for (Iterator it = nodes.iterator(); it.hasNext();) {
                    Element elm 
    = (Element) it.next();

                    
    if (elm.attributeValue("name").equals(member.getName())) {
                        elm.element(
    "age").setText(member.getAge());
                        elm.element(
    "title").setText(member.getTitle());
                        
    break;
                    }

                }


                writeDocumentToFile();

                
    return false;
            }
     catch (PersistFileWriteException ex) {
                
    throw ex;
            }

        }


        
    public boolean delete(String name) throws PersistFileWriteException {
            
    try {
                Element rootElm 
    = document.getRootElement();
                List nodes 
    = rootElm.elements("member");

                
    for (Iterator it = nodes.iterator(); it.hasNext();) {
                    Element elm 
    = (Element) it.next();
                    Member member 
    = new Member(elm.attributeValue("name"), elm
                            .elementText(
    "age"), elm.elementText("title"));

                    
    if (member.getName().equals(name)) {
                        rootElm.remove(elm);
                        
    break;
                    }

                }


                writeDocumentToFile();

                
    return false;
            }
     catch (PersistFileWriteException ex) {
                
    throw ex;
            }

        }


        
    public boolean delete(Member member) throws PersistFileWriteException {
            
    return delete(member.getName());
        }

    }



    posted on 2007-11-15 10:22 sitinspring 閱讀(477) 評論(0)  編輯  收藏 所屬分類: Object Orient Programming

    sitinspring(http://m.tkk7.com)原創(chuàng),轉載請注明出處.
    主站蜘蛛池模板: 无码国产精品一区二区免费vr | 亚洲视频在线精品| 久久精品国产亚洲一区二区三区| 亚洲一区无码中文字幕| 亚洲国产精品福利片在线观看| 中文字幕亚洲精品| 亚洲一本一道一区二区三区| 污网站在线免费观看| 免费久久人人爽人人爽av| 久久久久久精品免费看SSS| 日本免费电影一区| 国产亚洲?V无码?V男人的天堂 | 国产午夜影视大全免费观看| 中文亚洲AV片不卡在线观看| 久久久亚洲欧洲日产国码是AV| 亚洲色欲啪啪久久WWW综合网| 无码日韩人妻AV一区免费l | 亚洲国产综合人成综合网站| 久久亚洲综合色一区二区三区| 亚洲中文字幕久久精品无码2021| 无码天堂va亚洲va在线va| 国产免费一区二区三区在线观看| 国产四虎免费精品视频| 亚洲成?v人片天堂网无码| 无码欧精品亚洲日韩一区| 一本色道久久88亚洲精品综合 | 久久久婷婷五月亚洲97号色| 亚洲JLZZJLZZ少妇| 国产精品白浆在线观看免费| 免费无码看av的网站| 亚洲精品国偷自产在线| 亚洲精品二三区伊人久久| 亚欧国产一级在线免费| 黄页网站免费观看| 亚洲伊人久久精品影院| 亚洲欧美日韩中文字幕在线一区| 国产一级a毛一级a看免费视频| 嫩草视频在线免费观看| 亚洲AV福利天堂一区二区三| 狼人大香伊蕉国产WWW亚洲| 91久久青青草原线免费|