分享
 
 
 

Java程序的脏数据问题处理

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

脏数据(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 <codeReportPrinter</code 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 <codeStorageUsageHandler</code instance.

*

* @return the single <codeStorageUsageHandler</code instance

*/

public static StorageUsageHandler getStorageUsageHandler() {

if(handler == null) {

handler = new StorageUsageHandler();

}

return handler;

}

/**

* Constructs a <codeStorageUsageHandler</code 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 <codeStorageUsageHandler</code 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 <codeStorageUsageHandler</code 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("<html<titleStorage Usage</title<body");

writer.println("<table width='100%'");

for(int i = 0; i < sizes.length; i++) {

writer.print("<tr<td align='center' nowrap");

writer.print(users.get(i) + ": " + sizes[i]);

writer.println("</td</tr");

}

writer.println("</body</html");

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 somet

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有