監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設(shè)計管理系統(tǒng) | 簽約案例 | 購買價格 | 在線試用 | 手機(jī)APP | 產(chǎn)品資料
X 關(guān)閉

如何保證數(shù)據(jù)庫操作與文件系統(tǒng)操作的一致性

申請免費試用、咨詢電話:400-8352-114

文章來源:泛普軟件

通常來講,支持事務(wù)的資源一般稱為Resource Manager,如數(shù)據(jù)庫,完成了事物相關(guān)操作和數(shù)據(jù)恢復(fù),我們使用JDBC來編寫數(shù)據(jù)庫訪問程序,并可以通國調(diào)用commit,rollback來提交或者回滾事務(wù),也可以通過接口來設(shè)置隔離級別。如果需求是將數(shù)據(jù)存儲到數(shù)據(jù)中,那程序員是不需要擔(dān)心事務(wù)問題的。但如,如果數(shù)據(jù)非得存儲在文件系統(tǒng)中,或者聯(lián)合數(shù)據(jù)使用,那么,數(shù)據(jù)的一致和隔離如何保證呢?

用一個最常碰到的需求作為開始,用戶注冊后,數(shù)據(jù)保存在數(shù)據(jù)庫里,然后用戶上傳的個人肖像圖片保存到文件系統(tǒng)中(稍后會解釋為甚還要把數(shù)據(jù)存儲到文件系統(tǒng)里),顯然倆個操作都必須同時成功或者失敗,為了保證這一點,程序應(yīng)該怎么寫呢?

如果不關(guān)注一致性,程序可能代碼如下:

public void register(User user,byte[] images) throws Exception{

UserDao dao = new UserDao();

dao,addUser(user);

FileSystem fs = FileSystemFactory.getFileSystem();

//保存圖片到指定路徑,有可能拋出異常

fs.saveFile(user.getImagePath(),images)

}

 

上述代碼的潛在問題就是如果文件系統(tǒng)存儲失敗,那么,數(shù)據(jù)就會不一致,頁面顯示用戶信息的時候,圖片確沒有找到。后果稍微嚴(yán)重的列子還有些,譬如上傳密鑰文件失敗但相關(guān)數(shù)據(jù)確已經(jīng)存儲到數(shù)據(jù)庫。

如何解決這個問題呢?有倆種思路,一種我稱著“工程思路”,因為這是比我還老的一程序提出的辦法,他通常很實際。另外一個稱為"純技術(shù)思路",因為這是比他還老的一個更老的程序員提出的來辦法,而他很擅長技術(shù)語言框架,但不太擅長實施工程。

所謂工程思路,其實就是對操作紀(jì)錄日志,然后有后臺系統(tǒng)監(jiān)控錯誤并提供管理模塊供事后糾正這些錯誤,這就是所謂的“沖正”,比如上面一個例子,可以寫成下面的代碼

public void register(User user,byte[] images) throws Exception{

Logger log = LoggerFactrory,getLogger();

log.addTaskDescription("insert user "+user).addTaskDescription("save file"+user.getImagePath())

UserDao dao = new UserDao();

dao,addUser(user);

log.taskStatus("inser user is completed");

FileSystem fs = FileSystemFactory.getFileSystem();

//保存圖片到指定路徑,有可能拋出異常

fs.saveFile(user.getImagePath(),images)

log.taskStatus("save file is completed");

}

 

Logger將日志保存到數(shù)據(jù)庫中,這樣管理人員可以查看這些日志從而知道存在哪些不一致的地方。

還有一種就是純技術(shù)思路,既提供類似數(shù)據(jù)庫這樣的ResourceManager,支持文件系統(tǒng)操作的事務(wù)和隔離,并且,能加入到分布式事務(wù)中,從而能保證跟數(shù)據(jù)庫操作的一致性。如下面接口(可以想象類似JBDC的Connection)

Public interface FileSystemConnection{

public void addFile(String path,byte[] bs);

public void removeFile(String path);

public byte[] getFileContent(String path);

public String[] listFile(String root);

public void commit();

public void rollback();

}

 

實現(xiàn)方式我想類似于數(shù)據(jù)庫的實現(xiàn)方式,但又要與數(shù)據(jù)庫有所不同,這是因為之所以用文件系統(tǒng)存文件而不是數(shù)據(jù)庫是因為

1:速度更好。數(shù)據(jù)庫要轉(zhuǎn)化為自己特定格式存,當(dāng)然慢些

2:有些應(yīng)用只能讀取文件系統(tǒng),而不能跟數(shù)據(jù)庫打交道,如圖片純在文件系統(tǒng)里,然后配置apache可以直接讀取這些圖片

3:由于很可能外部系統(tǒng)也要操作文件,所以文件系統(tǒng)ResourceManager必須考慮到這個情況。(IT專家網(wǎng)論壇)

發(fā)布:2007-04-21 14:07    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
長春OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢

泛普長春OA行業(yè)資訊其他應(yīng)用

長春OA軟件 長春OA新聞動態(tài) 長春OA信息化 長春OA快博 長春OA行業(yè)資訊 長春軟件開發(fā)公司 長春門禁系統(tǒng) 長春物業(yè)管理軟件 長春倉庫管理軟件 長春餐飲管理軟件 長春網(wǎng)站建設(shè)公司