首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 以 XML 為持久層實作方案:輕量級資料存取完整架構

     編輯:Java 相關知識

適用場景與設計目標

針對中小型應用、桌面程式或輕量 Web 系統,傳統關聯式資料庫過重、OODB 學習曲線陡峭。XML 檔案作為持久介質具備:人類可讀、跨平台、無需額外安裝、版本控管友善等優勢。

核心需求

  1. 物件 CRUD 操作
  2. 執行緒安全(適用桌面與 Web)
  3. 記憶體快取:XML 檔遺失時仍可運作

雙層架構設計

MemberService:業務邏輯與快取層

  • 內建 Hashtable<String, Member> 做身分識別快取
  • 所有寫入操作 (add/update/delete) 採用 synchronized(lockObj) 確保執行緒安全
  • 寫入成功後才更新快取,保證快取與持久層一致性
  • 讀取操作無需同步(僅讀取快取)

MemberPersistence:XML 檔案存取層

  • 使用 dom4j 操作 XML DOM
  • 檔案不存在時自動建立根元素 <members/>
  • 封裝兩種受檢例外:XmlFileReadException、XmlFileWriteException

關鍵程式碼實作

MemberService 核心方法

public boolean add(Member member) {
    if (hasMember(member)) return false;
    synchronized (lockObj) {
        try {
            memberPersistence.add(member);  // 先持久化
            members.put(member.getId(), member);  // 再更新快取
            return true;
        } catch (XmlFileWriteException ex) {
            logError("add", member.getId(), ex);
            return false;
        }
    }
}

public boolean update(Member member) {
    if (!hasMember(member)) return false;
    synchronized (lockObj) {
        try {
            memberPersistence.update(member);
            Member cached = members.get(member.getId());
            cached.setName(member.getName());
            cached.setAge(member.getAge());
            return true;
        } catch (XmlFileWriteException ex) {
            logError("update", member.getId(), ex);
            return false;
        }
    }
}

public boolean delete(Member member) {
    if (!hasMember(member)) return false;
    synchronized (lockObj) {
        try {
            memberPersistence.delete(member.getId());
            members.remove(member.getId());
            return true;
        } catch (XmlFileWriteException ex) {
            logError("delete", member.getId(), ex);
            return false;
        }
    }
}

MemberPersistence XML 操作

// 新增
public boolean add(Member member) throws XmlFileWriteException {
    Element root = document.getRootElement();
    Element memberElm = root.addElement("member").addAttribute("id", member.getId());
    memberElm.addElement("name").setText(member.getName());
    memberElm.addElement("age").setText(String.valueOf(member.getAge()));
    writeDocumentToFile();
    return true;
}

// 更新
public boolean update(Member member) throws XmlFileWriteException {
    for (Element elm : (List<Element>) root.elements("member")) {
        if (elm.attributeValue("id").equals(member.getId())) {
            elm.element("name").setText(member.getName());
            elm.element("age").setText(String.valueOf(member.getAge()));
            break;
        }
    }
    writeDocumentToFile();
    return true;
}

// 刪除
public boolean delete(String id) throws XmlFileWriteException {
    for (Element elm : (List<Element>) root.elements("member")) {
        if (elm.attributeValue("id").equals(id)) {
            root.remove(elm);
            break;
        }
    }
    writeDocumentToFile();
    return true;
}

// 載入快取
public Hashtable<String, Member> loadMemberFromFile() {
    Hashtable<String, Member> map = new Hashtable<>();
    for (Element elm : (List<Element>) document.getRootElement().elements("member")) {
        Member m = new Member(
            elm.attributeValue("id"),
            elm.elementText("name"),
            Integer.parseInt(elm.elementText("age"))
        );
        map.put(m.getId(), m);
    }
    return map;
}

XML 檔案結構範例

<?xml version="1.0" encoding="UTF-8"?>
<members>
    <member id="M001">
        <name>王小明</name>
        <age>28</age>
    </member>
    <member id="M002">
        <name>李大華</name>
        <age>35</age>
    </member>
</members>

設計亮點與擴充建議

特性實作方式擴充方向
執行緒安全單一鎖物件同步寫入改用 ReadWriteLock 提升讀取並發
快取一致性寫入成功才更新快取加入版本號/時間戳支援樂觀鎖
查詢彈性Strategy 模式:MemberFilter 介面整合 XPath/XQuery 複雜查詢
資料完整性ID 唯一性檢查、例外封裝加入 XML Schema 驗證
效能優化啟動載入全量快取大量資料分頁載入、引入索引機制

適用性評估

  • ✅ 資料量 < 10 萬筆、單機/小叢集、結構簡單、部署簡易性優先
  • ❌ 高併發寫入、複雜關聯查詢、ACID 交易需求、資料量巨大
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved