<%@ page contentType="text/html; charset=gb2312"%> 讨论如何避免Java程序中的数据脏读问题
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
讨论如何避免Java程序中的数据脏读问题
     发布者: 发布时间:2007-11-26
脏数据(Out-of-date data),指过时的数据。如果在您的Java程序中存在脏数据,将或多或少地给软件系统带来一些问题,如:无法实时地应用已经发生改变的配置,软件系统出现一些莫名其妙的、难以重现的、后果严重的错误等等。尽量避免脏数据的存在是非常有价值的。本文希望能在这方面给同行们一点帮助。Fragment 1. 缓存技术的脏数据问题/*** A report printer is used to print a report.** @version 1.0 9/9/2003* @author Bill*/public class ReportPrinter {/*** Constructs a ReportPrinter instance.*/public ReportPrinter() {// do something...}/*** Prints a printable.** @param printable the specified printable object*/public void print(Printable printable) {Graphics g = getGraphics();g.setFont(getReportFont(printable.getFont());printable.print(g);}/*** Returns the corresponding report font of a java font.** @param javaFont the specified java font* @return the corresponding report font*/private Font getReportFont(font javaFont) {Font reportFont = fontMap.get(javaFont);if(reportFont == null) {reportFont = loadFont(javaFont);fontMap.put(javaFont, reportFont);}return reportFont;}/*** Loads the corresponding report font of a java font.** @param javaFont the specified java font* @param the corresponding report font*/protected static Font loadFont(Font javaFont) {Font reportFont = null;// do something...return reportFont;}/*** The font map(java font->report font).*/private static HashMap fontMap = new HashMap();}Fragment 1中,由于装载一个java font所对应的report font开销较大,使用了缓存技术来避免这种开销。这是一种常见的提高性能的方式,而且在一般情况下运行良好。但是Fragment 1的设计与实现可能是不完备的,因为极有可能一个java font所对应的report font在系统启动之后发生变化,在这种变化发生之后,只有重启软件系统才能装载之,这常常是最终用户的抱怨之一。更可怕的是,类似的这种脏数据的存在还可能带来其它严重的、无法想象的后果。如何避免使用缓存技术所带来的脏数据问题呢?在设计、实现和测试时,应该清晰定义缓存数据的更新:i. 不考虑缓存数据的更新,重启软件系统是一种必要的方式;ii. 不考虑缓存数据的更新,缓存数据不可能成为脏数据(但在软件系统中,往往“不可能”会在一次又一次的重构之后变为“可能”);iii. 考虑缓存数据的更新,当源数据变化时,实时更新缓存数据。Fragment 2. Singleton模式的脏数据问题/*** A storage usage handler is used to query the storage usage of users.** @version 1.0 9/9/2003* @author Bill*/public class StorageUsageHandler {/*** Returns a StorageUsageHandler instance.** @return the single StorageUsageHandler instance*/public static StorageUsageHandler getStorageUsageHandler() {if(handler == null) {handler = new StorageUsageHandler();}return handler;}/*** Constructs a StorageUsageHandler instance.*/private StorageUsageHandler() {users = Context.getAllUsers();}/*** Returns the storage sizes of all the users.** @return the storage sizes*/public long[] getSizes() {long sizes[] = new long[users.size()];for(int i = 0; i < users.size(); i++) {sizes[i] = getOneSize(users.get(i));}}/*** Returns the storage size of a user.** @param user the specified user* @return the storage size*/protected long getSize(User user) {// do something...return 0;}/*** The StorageUsageHandler singleton.*/private static StorageUsageHandler handler;/*** The users.*/private List users;}您看出了问题所在吗?Fragment 2中,由于没有必要次次实例化StorageUsageHandler而带来不必要的开销,采用了Singleton模式以保证StorageUsageHandler只被实例化一次。在实例化SotrageUsageHandler时,StorageUsageHandler的类成员users将被赋值。由于不存在任何对users重新赋值的方法,一直驻留在软件系统中的users将不会发生任何变化。在软件系统启动之后,增加、删除或修改用户的操作经常会发生,而一旦发生这类操作,users就成为了脏数据,Fragment 2将无法正常工作。如何避免使用Singleton模式所带来的脏数据问题呢?对于Singleton类的类成员:i. 对于与Singleton类外部无依赖关系的类成员,不存在这种问题;ii. 对于依赖于Singleton类外部的类成员,且该类成员不存在更新机制,最好是将其去掉,需要时从Singleton类外部直接获取;如果这种办法不可行,应提供机制以确保在使用该类成员之前,该类成员已经被更新过。Fragment 3. 类使用的脏数据问题/*** A storage usage handler is used to query the storage usage of users.** @version 1.0 9/9/2003* @author Bill*/public class StorageUsageHandler implements AdminHandler {/*** Constructs a StorageUsageHandler instance.*/private StorageUsageHandler() {users = Context.getAllUsers();}/*** Returns the storage sizes of all users.** @return the storage sizes*/public long[] getSizes() {long sizes[] = new long[users.size()];for(int i = 0; i < users.size(); i++) {sizes[i] = getOneSize(users.get(i));}}/*** Returns the storage size of a user.** @param user the specified user* @return the storage size*/protected long getSize(User user) {// do something...return 0;}/*** Displays the storage usage of users.** @param req the http servlet request* @param res the http servlet response** @throws IOException* @throws ServletException*/public void process(HttpServletRequest req, HttpServletResponse res)throws IOException, ServletException {res.setContentType("text/html");res.setHeader("Cache-Control", "no-cache");res.setHeader("Pragma","no-cache");res.setDateHeader("Expires", 0);PrintWriter writer = new PrintWriter(res.getOutputStream());long sizes[] = getsizes();writer.println("");writer.println("");for(int i = 0; i < sizes.length; i++) {writer.print(" ");writer.print(users.get(i) + ": " + sizes[i]);writer.println("");}writer.println("");writer.flush();writer.close();}/*** The users.*/private List users;}/*** An admin servlet as a http servlet to process the admin http servlet* request and response.** @version 1.0 9/9/2003* @author Bill*/public class AdminServlet extends HttpServlet {/*** Initiates the configuration.** @param config the servlet config** @throws ServletException*/private void initConfig(ServletConfig config) throws ServletException {// do something...handlerMap.put("__storage_Usage__", new StorageUsageHandler());}/*** Processes the http servlet request and response.** @throws IOException* @throws ServletException*/public void service(HttpServletRequest req, HttpServletResponse res)throws IOException, ServletException {AdminHandler handler = handlerMap.get(req.getParameter("handler"));if(handler == null) {// do something...return;}handler.process(req, res);}/*** The admin handler map(handler name->handler).*/private HashMap handlerMap = new HashMap();}您一定看出了问题所在吧!Fragment 3中,由于StorageUsageHandler并不遵循Singleton模式,尽管StorageUsageHandler的类成员users只能在实例化StorageUsageHandler时被赋值,但是在单线程模式下,只要保证每次所使用的StorageUsageHandler实例是新实例化的,基本上还是没有问题的。问题在于,在初始化AdminServlet的过程中,StorageUsageHandler被实例化并存储起来。此后,除非servlet container重新装载AdminServlet,否则将无法重新实例化StorageUsageHandler,也将无法更新StorageUsageHandler的类成员users。这样,在发生了增加、删除或修改用户的操作之后,users将成为脏数据。如何避免类使用所带来的脏数据问题呢?i. 对于与类外部无依赖关系的类成员,不存在这种问题;ii. 对于依赖于类外部的类成员,且该类成员不存在更新机制。最好是将其去掉,需要时从类外部直接获取;如果这种办法不可行,应提供机制以确保在使用该类成员之前,该类成员已经被更新过;如果这种办法还不可行,请清晰地说明类的使用方式,以防止不当的类使用发生。以上用三个例子列举了三类常见的脏数据问题。事实上,Java程序中的脏数据问题存在形式非常多样,因而,在设计、实现、测试和重构过程中,紧记(Keep in mind)避免脏数据的存在是非常重要的,我们可以从系统、子系统、类和类成员等各个层次来检查Java程序。“只做好一件事”是对简单性的最佳诠释,这句话同样最好地诠释了软件系统在功能方面的正交性。然而,在面向对象的软件开发过程中,仅仅在功能方面确保正交性是不够的,还应该在数据存储方面来尽量保证正交性。当然,考虑到性能等因素,在数据存储方面确保正交性比较困难,对于破坏此规则的数据存储,应提供机制以确保所使用数据的实时性。
(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
用Java Server Faces建立交互式WEB站点
在Weblogic环境下调试Turbine Servlet实例
基于Ajax的应用程序架构汇总
如何详细了解更多有关RMI的资源?
EJB—从EJB会话bean访问EJB实体bean
EJB的继承和多态 [www.theserverside.com]
 
最近评论:
        
春暖花开
wow power leveling2 wow power leveling gvf wow power levelingfcvg wow power leveling wow power leveling wow powerlevelingfcgv wow powerlevelingwq4 wow powerleveling wow powerleveling wow powerleveling world of warcraft power leveling world of warcraft power leveling world of warcraft power leveling world of warcraft power levelingszr world of warcraft power leveling world of warcraft powerleveling world of warcraft powerlevelinge5t world of warcraft powerleveling world of warcraft powerleveling world of warcraft powerleveling wow gold wow gold wow goldrfy5 wow gold wow gold world of warcraft goldre world of warcraft goldgh world of warcraft gold world of warcraft goldfr world of warcraft gold AOC Power Levelinggvgv AGE OF CONAN Power Levelingllwwbb928 a7s6h7lb
        
春暖花开
wow power leveling2 wow power leveling gvf wow power levelingfcvg wow power leveling wow power leveling wow powerlevelingfcgv wow powerlevelingwq4 wow powerleveling wow powerleveling wow powerleveling world of warcraft power leveling world of warcraft power leveling world of warcraft power leveling world of warcraft power levelingszr world of warcraft power leveling world of warcraft powerleveling world of warcraft powerlevelinge5t world of warcraft powerleveling world of warcraft powerleveling world of warcraft powerleveling wow gold wow gold wow goldrfy5 wow gold wow gold world of warcraft goldre world of warcraft goldgh world of warcraft gold world of warcraft goldfr world of warcraft gold AOC Power Levelinggvgv AGE OF CONAN Power Levelingllwwbb928 n7h6t7kw
        
春暖花开
wow power leveling2 wow power leveling gvf wow power levelingfcvg wow power leveling wow power leveling wow powerlevelingfcgv wow powerlevelingwq4 wow powerleveling wow powerleveling wow powerleveling world of warcraft power leveling world of warcraft power leveling world of warcraft power leveling world of warcraft power levelingszr world of warcraft power leveling world of warcraft powerleveling world of warcraft powerlevelinge5t world of warcraft powerleveling world of warcraft powerleveling world of warcraft powerleveling wow gold wow gold wow goldrfy5 wow gold wow gold world of warcraft goldre world of warcraft goldgh world of warcraft gold world of warcraft goldfr world of warcraft gold AOC Power Levelinggvgv AGE OF CONAN Power Levelingllwwbb928 a7t6e7ft
        
春暖花开
wow power leveling2 wow power leveling gvf wow power levelingfcvg wow power leveling wow power leveling wow powerlevelingfcgv wow powerlevelingwq4 wow powerleveling wow powerleveling wow powerleveling world of warcraft power leveling world of warcraft power leveling world of warcraft power leveling world of warcraft power levelingszr world of warcraft power leveling world of warcraft powerleveling world of warcraft powerlevelinge5t world of warcraft powerleveling world of warcraft powerleveling world of warcraft powerleveling wow gold wow gold wow goldrfy5 wow gold wow gold world of warcraft goldre world of warcraft goldgh world of warcraft gold world of warcraft goldfr world of warcraft gold AOC Power Levelinggvgv AGE OF CONAN Power Levelingllwwbb928 y7h6f7sn
        
buying wow account
中国buying wow account网为国内buying wow account网络第一品牌,中国buying wow account网是国内最完善的buying wow account类产品buying wow account电子商务交易平台提供buying wow account设计,画册buying wow account作品,中国buying wow account设计网,一个寻找buying wow account灵感的地方!提供最有价值的buying wow account设计buying wow account产品库、buying wow account新闻、buying wow account技术文章、buying wow account企业。真正buying wow account商为您提供buying wow account信息 上海buying wow account公司是上海地区专业的buying wow account公司.欢迎联系上海buying wow account公司的buying wow account服务,作为上海知名buying wow account公司之一6787673@WOWGOLDS.COM
        
wow gold
访问量最高的wow gold网站,提供最新wow gold信息,山东wow gold,青岛wow gold,wow gold指南.6787671@WOWGOLDS.COM
        
wow gold
河北wow gold河北省wow gold|河北wow gold网|河北省wow gold网|河北wow gold公司|河北省wow gold公司北京联基wow gold公司是一家专业的北京wow gold公司,组成的专业wow gold公司。我wow gold公司擅长急件通栏wow gold按钮wow gold擎天柱wow gold弹出窗口wow gold浮动标示wow gold特形标识wow gold全屏收缩wow gold春联麒润wow gold网络的网站媒体,wow gold为贵站提供多种wow gold类别和形式的wow gold,只需要简单的将wow gold
        
google排名
添加google排名数据 定制google排名价格 支付google排名费用 博客选择google排名 网民点击google排名6787671@WOWGOLDS.COM
        
wow gold
wow gold公司,wow gold牌施工图,wow gold户外论坛,CEO,wow gold资讯,耗材,wow gold基本风压资料等等.6787671@WOWGOLDS.COM
        
google排名
全面介绍苏州google排名,苏州园林google排名水乡,全国google排名酒店优惠预订,google排名线路,google排名出行指南,google排名网上订房领航网络google排名网是一家以提供网络google排名传播解决方案以及google排名网络媒介代理为主的google排名新型网络google排名公司提供云南google排名线路,云南google排名景点,云南google排名助理,云南自助google排名,云南探险google排名,会议会展服务,会议google排名,google排名公司,google排名,广州译信google排名公司是广州一家专业google排名公司,作为广州多语言google排名提供商
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号