當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 吉林OA系統(tǒng) > 長(zhǎng)春OA系統(tǒng) > 長(zhǎng)春OA行業(yè)資訊
如何保證數(shù)據(jù)庫(kù)操作與文件系統(tǒng)操作的一致性
申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114
文章來(lái)源:泛普軟件通常來(lái)講,支持事務(wù)的資源一般稱為Resource Manager,如數(shù)據(jù)庫(kù),完成了事物相關(guān)操作和數(shù)據(jù)恢復(fù),我們使用JDBC來(lái)編寫數(shù)據(jù)庫(kù)訪問(wèn)程序,并可以通國(guó)調(diào)用commit,rollback來(lái)提交或者回滾事務(wù),也可以通過(guò)接口來(lái)設(shè)置隔離級(jí)別。如果需求是將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)中,那程序員是不需要擔(dān)心事務(wù)問(wèn)題的。但如,如果數(shù)據(jù)非得存儲(chǔ)在文件系統(tǒng)中,或者聯(lián)合數(shù)據(jù)使用,那么,數(shù)據(jù)的一致和隔離如何保證呢?
用一個(gè)最常碰到的需求作為開(kāi)始,用戶注冊(cè)后,數(shù)據(jù)保存在數(shù)據(jù)庫(kù)里,然后用戶上傳的個(gè)人肖像圖片保存到文件系統(tǒng)中(稍后會(huì)解釋為甚還要把數(shù)據(jù)存儲(chǔ)到文件系統(tǒng)里),顯然倆個(gè)操作都必須同時(shí)成功或者失敗,為了保證這一點(diǎn),程序應(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)
}
上述代碼的潛在問(wèn)題就是如果文件系統(tǒng)存儲(chǔ)失敗,那么,數(shù)據(jù)就會(huì)不一致,頁(yè)面顯示用戶信息的時(shí)候,圖片確沒(méi)有找到。后果稍微嚴(yán)重的列子還有些,譬如上傳密鑰文件失敗但相關(guān)數(shù)據(jù)確已經(jīng)存儲(chǔ)到數(shù)據(jù)庫(kù)。
如何解決這個(gè)問(wèn)題呢?有倆種思路,一種我稱著“工程思路”,因?yàn)檫@是比我還老的一程序提出的辦法,他通常很實(shí)際。另外一個(gè)稱為"純技術(shù)思路",因?yàn)檫@是比他還老的一個(gè)更老的程序員提出的來(lái)辦法,而他很擅長(zhǎng)技術(shù)語(yǔ)言框架,但不太擅長(zhǎng)實(shí)施工程。
所謂工程思路,其實(shí)就是對(duì)操作紀(jì)錄日志,然后有后臺(tái)系統(tǒng)監(jiān)控錯(cuò)誤并提供管理模塊供事后糾正這些錯(cuò)誤,這就是所謂的“沖正”,比如上面一個(gè)例子,可以寫成下面的代碼
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ù)庫(kù)中,這樣管理人員可以查看這些日志從而知道存在哪些不一致的地方。
還有一種就是純技術(shù)思路,既提供類似數(shù)據(jù)庫(kù)這樣的ResourceManager,支持文件系統(tǒng)操作的事務(wù)和隔離,并且,能加入到分布式事務(wù)中,從而能保證跟數(shù)據(jù)庫(kù)操作的一致性。如下面接口(可以想象類似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();
}
實(shí)現(xiàn)方式我想類似于數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方式,但又要與數(shù)據(jù)庫(kù)有所不同,這是因?yàn)橹杂梦募到y(tǒng)存文件而不是數(shù)據(jù)庫(kù)是因?yàn)?/P>
1:速度更好。數(shù)據(jù)庫(kù)要轉(zhuǎn)化為自己特定格式存,當(dāng)然慢些
2:有些應(yīng)用只能讀取文件系統(tǒng),而不能跟數(shù)據(jù)庫(kù)打交道,如圖片純?cè)谖募到y(tǒng)里,然后配置apache可以直接讀取這些圖片
3:由于很可能外部系統(tǒng)也要操作文件,所以文件系統(tǒng)ResourceManager必須考慮到這個(gè)情況。(IT專家網(wǎng)論壇)
- 1服務(wù)器虛擬化是實(shí)現(xiàn)綠色I(xiàn)T重要途徑
- 2IT史上最偉大的十大存儲(chǔ)發(fā)明
- 3評(píng)估綠色數(shù)據(jù)中心有哪些量化指標(biāo)
- 4提高服務(wù)器系統(tǒng)可管理性 滿足中小企業(yè)需求
- 5服務(wù)器虛擬化的綠色I(xiàn)T夢(mèng)想
- 6預(yù)算緊縮下如何保障公司安全運(yùn)營(yíng)
- 7注意提防統(tǒng)一通信帶來(lái)的安全威脅
- 85大絕招護(hù)航服務(wù)器的虛擬化實(shí)施
- 9確保Windows操作系統(tǒng)穩(wěn)定的六個(gè)秘笈
- 10CTO解讀企業(yè)數(shù)據(jù)安全管理與防護(hù)
- 11安全問(wèn)題應(yīng)當(dāng)慎用“拿來(lái)主義”
- 12虛擬機(jī)數(shù)量增加將加大系統(tǒng)安全風(fēng)險(xiǎn)
- 13如何更好管理一臺(tái)服務(wù)器上多個(gè)數(shù)據(jù)庫(kù)
- 14高效簡(jiǎn)化數(shù)據(jù)中心網(wǎng)絡(luò)的五項(xiàng)措施
- 15重復(fù)數(shù)據(jù)刪除技術(shù)的安全性如何
- 16提高寫文件的性能的簡(jiǎn)單方法
- 17談?wù)剶?shù)據(jù)丟失保護(hù)中的隱性成本控制
- 18分析:虛擬化技術(shù)給企業(yè)應(yīng)用帶來(lái)的優(yōu)勢(shì)
- 19企業(yè)組網(wǎng)要把握好網(wǎng)絡(luò)最后一公里
- 20保證Web登錄安全的四種密碼管理工具
- 21如何高效管理企業(yè)的基礎(chǔ)應(yīng)用服務(wù)?
- 22不要讓云計(jì)算成為皇帝的新衣
- 23開(kāi)源與SOA醞釀技術(shù)機(jī)制與商業(yè)模式變革
- 24如何恰當(dāng)評(píng)估和應(yīng)對(duì)數(shù)據(jù)中心各種風(fēng)險(xiǎn)
- 25Web2.0時(shí)代企業(yè)怎樣制定互聯(lián)網(wǎng)戰(zhàn)略
- 26不可不知的路由交換的安全七宗罪
- 27數(shù)據(jù)中心 迎接巨變
- 28OA辦公軟件的應(yīng)用范疇涉及到所有知識(shí)性員工
- 29應(yīng)用技巧:創(chuàng)建你自己的系統(tǒng)存儲(chǔ)過(guò)程
- 30數(shù)據(jù)中心自動(dòng)化是否預(yù)示自動(dòng)化時(shí)代的來(lái)臨
成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓