專案開發前期早就完成了,但投入實際使用時出現了些很小卻很頭痛的問題。其中最值得注意又最容易忽略的兩點,這裡作一下記錄。
第一:計數不同步
在專案投入使用後,發現資料總是會不同步,查遍了**,從理論上,都不可能發生,但是實際上卻又發生了。後來想起了以前看到過的文章,有提到多執行緒內操作同乙個變數進行加減時,變數可能會不一致。按照這個思路,去查了一下日誌記錄,果然發現計數有莫名跳動的情況。比如數字本來是從1自增到10的,可是中間卻出現了斷層(比如7、9、10),而有時甚至還出現了越界(比如計數上限是10,如果大於10會內部作了處理,會自動返回,但結果在小於等於10的後續邏輯中發現了11的記錄)。那這個要怎麼解決呢?之前在看com元件開發的《com技術內幕》時提到了採用內建的自增和自減函式的做法(interlockedincrement()和interlockeddecrement()),不過這是c++的做法,那c#有沒有類似的呢?搜了一下,果然有,對就的是interlocked.increment()和interlocked.decrement()(可以參見所不同的是,c#裡是將這兩個函式放到了interlocked類裡面去了。這樣處理之後,計數不同步的問題消失了。不過這樣處理有乙個不足的,會降低效能。
第二:日誌記錄太頻繁
計數不同步的問題得以發現,是因為作了日誌記錄。當時心裡暗喜,幸好作了這麼詳細的日誌記錄。但是後來專案繼續執行時, 發現了新問題,雖然計數是同步了,但是資料在介面上的更新相差太大,起初是幾個,後面竟然達到了200個之多,這對於客戶肯定是無法接受的。於是又是查詢、查詢,同樣是邏輯上沒有問題,但問題又出現了,思來想去,這極可能是更新介面占用了太多的時間片,想著是不是用非同步來處理更好。一查**,發現已經是begininvoke的非同步處理了。雖然非同步處理會相對滯後一步,但也不至於會滯後那麼多,所以問題應該不在這兒。繼續查詢,實在找不到問題點了,後面拿了客戶的資料庫備份來還原,想再查查日誌看看。在還原資料時,猛然發現了乙個問題,怎麼這備份檔案這麼大,竟然達到了近2g。客戶用的是sql express版本,對資料大小有限制,這會不會導致資料讀寫過慢?
那是什麼原因導致資料量增長的這麼快?一查資料庫的表,發現日誌資料增長的實在太快,雖然系統內部對日誌作了處理(超過半年的日誌會自動刪除),但這還是增長的太快了。再查增長這麼快的日誌內容,對應到**上,發現是一段關於計數記錄的日誌增加的最快,幾乎是100毫秒就會產生一筆記錄,這麼頻繁的運算元據庫,資料自然增長很快。果斷將可以不記錄的部分遮蔽掉,然後執行。發現介面資料與實據輸出的資料幾乎同步,最多相差一兩個,這麼說,問題應該就是這了。
可是為什麼資料庫的操作會影響到介面的更新呢?這源於更新介面時,出於互動需要必須從資料庫獲取資料。
所以在以後的專案開發中,一定要給自己提個醒,在發布時,要把除錯日誌和不必要記錄及可遮蔽的日誌給遮蔽掉,以免引來惡果。
修復了這兩個問題後,專案已經正常執行了幾個月了,這裡作乙個記錄。
專案中計數不同步和日誌記錄引發的BUG
專案開發前期早就完成了,但投入實際使用時出現了些很小卻很頭痛的問題。其中最值得注意又最容易忽略的兩點,這裡作一下記錄。第一 計數不同步 在專案投入使用後,發現資料總是會不同步,查遍了 從理論上,都不可能發生,但是實際上卻又發生了。後來想起了以前看到過的文章,有提到多執行緒內操作同乙個變數進行加減時,...
zabbix時間不同步
linux下如何實現與internet時間同步 一 安裝ntp root server 2 yum install y ntpdate二 同步時間 方式 一 使用網域名稱連線,要經過dns解析,速度慢。root server 2 ntpdate pool.ntp.org 方式 二 使用ip連線,超級...
MYSQL 日誌同步資料不同步
最近在做mysql主從備份時,發現,日誌已經同步,但是資料不同步的問題.後來,我就重新把做了一次主從設定,發現,竟然又同步了,一開始我還以為是我的儲存過程中使用了insert into select 所致呢.重新做的方案寫下來一下,以作記錄 主伺服器 1.停止mysql伺服器的外部接入.2.停止my...