· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [专题] IBM Rational高峰论坛 Windows 7十大功能
· [专题] 史上就危险7月 微软 BizSpark 计划介绍
· [IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 我也能做CTO_赛迪连载 赛迪七夕特别行动
· [热点] Chrome 4.0采用V8引擎 Java开发编程规范

JAVA使用XML作为持久存储介质实现方法 (1)

发布时间:2007.09.05 05:57     来源:赛迪网    作者:dxaw

对一些需要将数据持久化的小型程序中,传统的关系型数据库显得庞大而不实用,OO数据库有一个学习曲线的问题,而使用XML是一种较好的选择.本文将就设计一个合理的XML持久化的解决方案进行探讨.

使用XML作为持久层解决方案的,它的基本功能要有:

1.对象的CRUD功能(本例中基本对象是Member类).

2.保证线程安全,对桌面程序和Web程序都一样适用.

3.有缓存,在存储介质即XML文件突然丢失的情况下还能有效工作.

本例采用了MemberService和MemberPersistence两个类来协作完成这些功能.

MemberService是业务层和持久层之间的桥梁,用于对Member对象的CRUD操作,内置一个hashtable来缓存Member对象,即使文件突然丢失,缓存中的数据也不会被影响.它内置一个MemberPersistence成员来完成与持久介质的交互.

实现添加,删除,更新的三个函数add(),delete(),update()都用lockObj实现了同步,这样就无需担心线程安全问题.其它函数对members成员没有修改,故不需要实现同步.

try{ 
memberPersistence.add(member); 
members.put(member.getId(), member); 
return true; 
} 

catch(XmlFileWriteException ex){ 

   System.out.println("Member:" + member.getId() + " add error!"); 
   return false; 
}

当MemberPersistence添加对象成功后,这个对象才会被添加到members中,这样保证了缓存和实际数据的同步;如果颠倒一下顺序,那末MemberPersistence添加对象不成功时,出现XmlFileWriteException异常,这是还需要在catch中删除刚才添加的对象,这样做人为加大了程序的复杂度,不如上面的做法简单高效.

关于查询函数的做法不明白的请见 http://www.blogjava.net/sitinspring/archive/2007/06/05/122119.html 中形式三.

下面是MemberService类的全部代码:

package com.sitinpsring.service; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Hashtable; 
import java.util.Iterator; 
import java.util.List; 
import com.sitinpsring.domain.Member; 
import com.sitinpsring.domain.MemberFilter; 
import com.sitinpsring.exception.XmlFileReadException; 
import com.sitinpsring.exception.XmlFileWriteException; 
import com.sitinpsring.persistence.MemberPersistence; 
public class MemberService { 
private static Hashtable<String, Member> members; 
private static MemberPersistence memberPersistence; 
private static final Object lockObj = new Object(); 
static { 
try { 
memberPersistence = new MemberPersistence("member.xml"); 
members = memberPersistence.loadMemberFromFile(); 
} catch (XmlFileReadException ex) { 
System.out.println("Can’t read the file:member.xml"); 
}catch (XmlFileWriteException ex) { 
System.out.println("Can’t write to the file:member.xml"); 
} 
} 
public MemberService() { 
} 
public boolean hasMember(String id) { 
return members.containsKey(id); 
} 
public boolean hasMember(Member member) { 
return hasMember(member.getId()); 
} 
public boolean add(Member member) { 
if (hasMember(member)) { 
System.out.println("Member:" + member.getId() + " has been exist!"); 
return false; 
} else { 
synchronized (lockObj) { 
try{ 
memberPersistence.add(member); 
members.put(member.getId(), member); 
return true; 
} 
catch(XmlFileWriteException ex){ 
System.out.println("Member:" + member.getId() + " add error!"); 
return false; 
} 
} 
} 
} 
public boolean update(Member member) { 
if (hasMember(member)) { 
synchronized (lockObj) { 
try{ 
memberPersistence.update(member); 
Member oldMember = members.get(member.getId()); 
oldMember.setName(member.getName()); 
oldMember.setAge(member.getAge()); 
return true; 
} 
catch(XmlFileWriteException ex){ 
System.out.println("Member:" + member.getId() + " upate error!"); 
return false; 
} 
} 
} else { 
System.out.println("Member:" + member.getId() 
+ " can’t been found!"); 
return false; 
} 
} 
public boolean saveOrUpdate(Member member) { 
if (hasMember(member)) { 
return update(member); 
} else { 
return add(member); 
} 
} 
public boolean delete(Member member) { 
if (hasMember(member)) { 
synchronized (lockObj) { 
try{ 
memberPersistence.delete(member.getId()); 
members.remove(member.getId()); 
return true; 
}catch(XmlFileWriteException ex){ 
System.out.println("Member:" + member.getId() + " delete error!"); 
return false; 
} 
} 
} else { 
System.out.println("Member:" + member.getId() 
+ " can’t been found!"); 
return false; 
} 
} 
@SuppressWarnings("unchecked") 
public List<Member> search(MemberFilter memberFilter) { 
ArrayList<Member> retval = new ArrayList<Member>(); 
for (Iterator it = members.keySet().iterator(); it.hasNext();) { 
String key = (String) it.next(); 
Member member = members.get(key); 
if (memberFilter.accept(member)) { 
retval.add(member); 
} 
} 
Collections.sort(retval); 
return retval; 
} 
public List<Member> getAll() { 
MemberFilter filter = new MemberFilter() { 
public boolean accept(Member member) { 
return true; 
} 
}; 
return search(filter); 
} 
public Member getMemberById(String id) { 
for (Iterator it = members.keySet().iterator(); it.hasNext();) { 
String key = (String) it.next(); 
Member member = members.get(key); 
if (member.getId().equals(id)) { 
return member; 
} 
} 
return null; 
} 
}

1 2 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 掌握好Ping命令技巧 帮你解决网络故障 (09-04) · Java编程实战篇:设计自己的Annotation (09-03)
· 为何要搭配用Struts+Spring+Hibernate (09-03) · 让 Java ME 程序实现真正Run Anywhere (08-31)
· 从JAR和ZIP档案文件中提取Java资源讲解 (08-31) · Java程序员需要了解的几个开源协议介绍 (08-30)
· JAVA基础:自动生成你的程序开发文档 (08-30) · 深入分析Java中webwork的文件上传机制 (08-30)
· 字节码防止内存错误提高代码质量 (08-29) · 编程需要注意的陷阱:Java继承是有害的 (08-29)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
专题:谷歌发布PC操作系统Chrome OS
·芯能量 新动力 兴经济:..
·专题:英特尔与AMD和解 ..
·专题:惠普27亿收购3Com..
专题:
·专题:诺基亚危局已现 ..
·六股势力角逐4G标准 中..
·专题:联通iPhone并不贵..
 
·惠普123459黑白激打家族..
·云计算格局初现 三大阵..
·分析:虚拟化在高性能计..
2009 IBM动态架构新动力论坛
·直播:第八届中国系统与..
·专题:置身智慧海洋——..
·专题:让物品开口说话 ..