xml 防止併發處理

2021-06-06 19:26:42 字數 1424 閱讀 1705

**整站的快取方式都是依靠的dataset的readxml和writexml的方式實現的,這種方式在訪問量不是很大的**中是一點問題都沒有的(最大可承受的日ip估計在8000-15000左右),但是當你的**日ip訪問量到達20000時,他就完全崩潰了,出現xml的併發占用問題日趨嚴重,於是我們就採用了檔案流的形式去操作,具體**如下:

寫入:stream s = null;

s = file.open(filename, filemode.create, fileaccess.readwrite,fileshare.readwrite);

binaryformatter b = new binaryformatter();

b.serialize(s, ds);

s.close();

讀取:stream s = null;

s = file.open(filename, filemode.open, fileaccess.read);

binaryformatter b = new binaryformatter();

ds = (dataset)b.deserialize(s);

s.close();

這種方式在一定程度上解決了直接使用dataset的readxml和writexml的方式帶來的問題,但是當**的日訪問量達到40000或更高時,併發問題依然存在,其實存在併發的根本原因不是我們用了什麼方式去讀取或者寫入(方式的不同的確在一定程度上可以解決一些問題,但根本原因沒有得到**),而是在兩個或者更多個程序(有需要讀取的也有需要寫入的)在爭搶同乙個檔案時程式如何給出乙個可以讓雙方滿意的方案,於是順著這個思路,我有對程式做了以下改進:

//讀取鎖,可以讓乙個檔案被多個程序同時讀取,也可以保證只被乙個程序改寫

readerwriterlock locker = new readerwriterlock();//讀取鎖()

寫入:stream s = null;

tryelse

binaryformatter b = new binaryformatter();

b.serialize(s, ds);

s.close();

}finally

locker.releasewriterlock();//釋放寫鎖定

//這裡可以加入刪除臨時檔案的**,但不建議這樣做,我測試了下,會產生新的讀寫併發問題。

}讀取:

stream s = null;

stream stemp = null;

trycatch//這裡使用catch主要是因為當讀取方法所讀的檔案正在被改寫時會獲取空內容導致異常,或者寫入超時導致檔案內容出錯時異常,或者讀鎖定超時後讀取臨時檔案時剛好臨時檔案被刪除時發生異常

}finally

if(stemp!=null)

locker.releasereaderlock();

}

併發防止重複提交

專案中遇到了伺服器介面重複被呼叫的情況,導致資料多次提交的問題。對於請求的重複提交,前端有一些治標的辦法,後台也有一些常規的token驗證。但是在併發的情況下,一些傳統的辦法失去了作用。1 比如說前台js控制,如果遇到惡意攻擊,通過介面無限併發請求,資料還是會出問題。2 session裡面存toke...

《轉》 mysql處理高併發,防止庫存超賣

今天王總又給我們上了一課,其實mysql處理高併發,防止庫存超賣的問題,在去年的時候,王總已經提過 但是很可惜,即使當時大家都聽懂了,但是在現實開發中,還是沒這方面的意識。今天就我的一些理解,整理一下這個問題,並希望以後這樣的課程能多點。先來就庫存超賣的問題作描述 一般電子商務 都會遇到如 秒殺 之...

xml 檔案處理

字串專為xml類 xdocument xmldocument xdocument.parse xmlcontent 子代string tablaname xmldocument.descendants tablename elementat 0 value.tostring string tabla...