Java程式的髒資料問題 (轉)
的髒資料問題
髒資料(Out-of-date data),指過時的資料。
如果在您的Java程式中存在髒資料,將或多或少地給帶來一些問題,如:無法實時地應用已經發生改變的,軟體系統出現一些莫名其妙的、難以重現的、後果嚴重的錯誤等等。儘量避免髒資料的存在是非常有價值的。本文希望能在這方面給同行們一點幫助。
Fragment 1. 快取技術的髒資料問題
/**
* A report printer is used to print a report.
*
* @version 1.0 9/9/
* @author Bill
*/
public class ReportPrinter {
/**
* Constructs a ReportPrinter
instance.
*/
public ReportPrinter() {
// do something...
}
/**
* Prints a printable.
*
* @param printable the specified printable
*/
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 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("
"); writer.print(users.get(i) + ": " + sizes[i]); writer.println(" |
相關文章
- MySQL5.7:PageCleaner的刷髒問題MySql
- 都是髒資料惹的禍
- java轉型問題Java
- 資料倉儲資料質量的問題探討(轉)
- 解決兩相同資料庫資料同步的問題 (轉)資料庫
- 請教Java+tomcat資料庫程式設計問題?JavaTomcat資料庫程式設計
- 觸發DBWR程式寫髒資料塊到資料檔案的幾個條件
- JAVA訪問雲資料mysql出現問題JavaMySql
- 03.Java資料結構問題Java資料結構
- java Socket接收資料亂碼問題Java
- Java的國際化問題 (轉)Java
- 轉:EXP 資料庫資料 QUERY 選項使用問題資料庫
- 深度分析資料庫的熱點塊問題(轉)資料庫
- java的socket程式設計問題Java程式設計
- java 解析php序列化資料問題JavaPHP
- JAVA的一些基本問題(轉)Java
- java中的易混問題收集(轉)Java
- 關於資料倉儲的十個最長問的問題 (轉)
- 檢視某個資料庫在快取中的髒資料資料庫快取
- Swift 的資料問題Swift
- Mysql多臺資料庫同步問題(轉)MySql資料庫
- 請問java中向網頁匯入資料問題!Java網頁
- Java的資料庫程式設計(JDBC)技術[轉]Java資料庫程式設計JDBC
- Java中文問題詳解(轉)Java
- AI 資料標註不是“髒活累活”AI
- 使用Sqlserver更新鎖防止資料髒讀SQLServer
- java讀資原始檔的問題Java
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- SharePreference原理及跨程式資料共享的問題
- 陣列轉json後的資料型別問題陣列JSON資料型別
- 使用Visual Basic訪問資料庫幾個注意的問題 (轉)資料庫
- 一個JAVA程式呼叫外部程式的問題!(急)Java
- MySQL大量髒資料,如何只保留最新的一條?MySql
- Java Thread應該注意的問題 (轉)Javathread
- java中有關日期的顯示問題 (轉)Java
- jboss訪問資料庫的問題資料庫
- Oracle資料庫字符集問題解析(轉)Oracle資料庫
- 五個常見 PHP 資料庫問題(轉)PHP資料庫