1:問題
在做web開發的時候,有時候會遇到這種情況,數據庫里的數據是固定不變的,大概幾千條,而頁面要載入所有的數據,甚至載入的數據每一條要根據條件判斷分好幾組顯示,這樣一來,每一條數據根據組數要判斷一次、啟動一次數據庫;如果是幾千條數據,則會出現判斷啟動數據庫次數為:幾千條數據*組數;如果里面的邏輯再復雜一點,可能還要*其他...;然后做一次操作也有可能會刷新一次頁面,這樣直接連接數據庫操作,會使得頁面載入很慢,有時候都要等上2分鍾以上。
2:解決
為了提高頁面載入的效率,可以在網站服務器一啟動時就將數據庫中的數據載入內存,刷新頁面的時候只取內存中的數據,這樣不用每次都啟動數據庫;在增刪改數據庫中的數據時,需要也對內存中的數據進行增刪改,以便保持內存數據和數據庫中的數據同步;
3:注意
A: 由於要對內存中的數據進行修改,當有多個用戶進行操作時,有可能會出現A在修改內存中的記錄,而B又要刪除內存中的記錄,這樣就會造成死鎖,會報錯誤,因此在對數據進行增刪改的時候,要鎖住線程。object obj=new object(); Lock(obj){//do...} 這樣,不同的操作就會排隊等待,不至於沖突了。
B: 在設計時,一般業務邏輯層會設計一些邏輯對象,用在內存中存儲數據庫中的數據,對象屬性是表結構;也會用到對象與對象之間的組合關系,他用來表達表與表之間的關系,(如果需要對list列表進行復制操作,可以在讓邏輯對象類繼承ICloneable接口,實現Clone方法就可。)
C: 需要設計一個內存管理類CacheManage,他用來管理所有對內存中數據進行操作的方法;在內存中的底層List<表結構>修改的時候都需要lock,而網頁刷新的時候會用到頁面層的list<表結構>,只有當底層的List<表結構>修改了才需要重新獲取頁面層的List;否則不需要獲取;在這里需要設置一個開關,以確定是否頁面上的List是最新的數據。
為何在內存里要設計兩個List(底層List和頁面級List)呢??估計是:web開發的獨特性;因為不同的人使用終端發送請求,頁面會一直不停的刷,如果既使用底層的List來進行增刪改,又使用底層的List來獲取數據顯示,那使用的人越多就越要排隊,等待的時間就越久,頁面都有可能根本刷不出來,所以頁面級List就是底層List的復制品,當底層List沒有變化時直接獲取頁面級的List,當底層的List改變后,就需要將底層List重新復制給頁面級的List,以便同步;