成都公司:成都市成華區(qū)建設南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務大廈18樓
當前位置:工程項目OA系統(tǒng) > 泛普各地 > 吉林OA系統(tǒng) > 長春OA系統(tǒng) > 長春OA行業(yè)資訊
如何保證數(shù)據(jù)庫操作與文件系統(tǒng)操作的一致性
通常來講,支持事務的資源一般稱為Resource Manager,如數(shù)據(jù)庫,完成了事物相關操作和數(shù)據(jù)恢復,我們使用JDBC來編寫數(shù)據(jù)庫訪問程序,并可以通國調(diào)用commit,rollback來提交或者回滾事務,也可以通過接口來設置隔離級別。如果需求是將數(shù)據(jù)存儲到數(shù)據(jù)中,那程序員是不需要擔心事務問題的。但如,如果數(shù)據(jù)非得存儲在文件系統(tǒng)中,或者聯(lián)合數(shù)據(jù)使用,那么,數(shù)據(jù)的一致和隔離如何保證呢?
用一個最常碰到的需求作為開始,用戶注冊后,數(shù)據(jù)保存在數(shù)據(jù)庫里,然后用戶上傳的個人肖像圖片保存到文件系統(tǒng)中(稍后會解釋為甚還要把數(shù)據(jù)存儲到文件系統(tǒng)里),顯然倆個操作都必須同時成功或者失敗,為了保證這一點,程序應該怎么寫呢?
如果不關注一致性,程序可能代碼如下:
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ù)就會不一致,頁面顯示用戶信息的時候,圖片確沒有找到。后果稍微嚴重的列子還有些,譬如上傳密鑰文件失敗但相關數(shù)據(jù)確已經(jīng)存儲到數(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ù)據(jù)庫這樣的ResourceManager,支持文件系統(tǒng)操作的事務和隔離,并且,能加入到分布式事務中,從而能保證跟數(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)化為自己特定格式存,當然慢些
2:有些應用只能讀取文件系統(tǒng),而不能跟數(shù)據(jù)庫打交道,如圖片純在文件系統(tǒng)里,然后配置apache可以直接讀取這些圖片
3:由于很可能外部系統(tǒng)也要操作文件,所以文件系統(tǒng)ResourceManager必須考慮到這個情況。(IT專家網(wǎng)論壇)
本文內(nèi)容來自自互聯(lián)網(wǎng)公開信息或用戶自發(fā)貢獻,該文觀點僅代表作者本人,版權歸原作者所有。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。若發(fā)現(xiàn)侵權或違規(guī)內(nèi)容請聯(lián)系電話4008352114或郵箱442699841@qq.com,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。
本站推薦
- 1土建行業(yè)項目管理需求如何管控優(yōu)化
- 2上海電梯維保合同管理如何實現(xiàn)高效規(guī)范管理
- 3泛普軟件如何助力集團企業(yè)突破管理困境呢?
- 4泛普軟件如何解決機電工程公司項目權限與薪資結(jié)算難題呢?
- 5泛普軟件如何成為建筑企業(yè)行政事務管理的“百事通”
- 6庫存管理系統(tǒng)如何反記賬的實用方法與操作要點
- 7工程現(xiàn)場管理平臺的魅力揭示,發(fā)現(xiàn)它如何革新管理方式!
- 8直觀呈現(xiàn):工程建筑企業(yè)管理平臺如何優(yōu)化項目流程與提升效率
- 9聯(lián)通工程審計管理系統(tǒng)如何提升工程效益?探索關鍵策略

