佘勇 虞芬
摘 要:隨著社會和計算機水平的不斷的發展,人們在日常生活和工作中處理的數據越來越多,這給數據庫服務器帶來很大的負擔,并且大量的數據傳送造成網絡傳輸瓶頸。大量的用戶都需要通過數據庫來查詢符合自己需求的數據,而且很多的用戶查詢的是相同的數據。開始人們用提升服務器的配置來解決工作負擔大的問題,但這是換湯不換藥的做法,沒有從根本上解決這個問題。可采用緩存減輕服務器的負擔,把以前查詢過的結果存放在客戶端,再有相同的查詢時不用去請求服務器返回結果,而是由客戶端直接返回結果給用戶。這篇論文主要討論緩存模塊中數據庫返回的查詢結果如何存取。
關鍵詞:Cache;OSCache;緩存;客戶端;數據庫服務器
文件存取模塊的設計
下面我們以Map接口為例來說明設計下文件存取模塊使用各種實現類時,總是要生成數據結構的具體實現,因為系統不知道集合中如何存放對象。但在訪問實際集合時,用使用接口的方法,這樣就可以在需要時將數據結構從數組集合變成散列表的集合然后由于集合類仍然實現相同的集合接口,不需要改變他的代碼。
用何種方式存放對象呢?這是緩存最為重要的一步,在Java 2中有很多的數據結構接口,接口和集合類的選擇是緩存非常重要的。
Map接口用于保持關鍵字(Key)和數值(Value)的集合,集合中的每個項目加入時都提供數值和關鍵字
Map接口有三個實現集合類;HashMap、WeakHashMap、和TreeMap 類。HashMap是基于Hash表的映射;WeakHashMap是基于弱引用Hash表的映射;TreeHash是基于平衡樹的映射。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現 HashMap允許將null作為一個entry的key或者value,而Hashtable不允許 還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。
HashMap可謂JDK的一大實用工具,把各個Object映射起來,實現了“鍵--值”對應的快速存取。但實際里面做了些什么呢?
在這之前,先介紹一下負載因子和容量的屬性。大家都知道其實一個HashMap 的實際容量就因子*容量,其默認值是 16×0.75=12;這個很重要,對效率很一定影響!當存入HashMap的對象超過這個容量時,HashMap 就會重新構造存取表。兩個關鍵的方法,put和get:
先有這樣一個概念,HashMap是聲明了Map,Cloneable, Serializable接口,和繼承了AbstractMap類,里面的 Iterator其實主要都是其內部類HashIterator和其他幾個 iterator類實現,當然還有一個很重要的繼承了Map.Entry的 Entry內部類,它包含了hash,value,key和next這四個屬性,很重要。
這個就是判斷鍵值是否為空,并不很深奧,其實如果為空,它會返回一個static Object作為鍵值,這就是為什么HashMap允許空鍵值的原因。
我們把關鍵的方法拿出來分析:
因為hash的算法有可能令不同的鍵值有相同的hash碼并有相同的table索引,如:key=“33”和key=Object g的hash都是-8901334,那它經過indexfor之后的索引一定都為i,這樣在new的時候這個Entry的next就會指向這個原本的table[i],再有下一個也如此,形成一個鏈表,和put的循環對定e.next獲得舊的值。到這里,HashMap的結構,大家也十分明白了吧?
所謂的重構也不萬能的,就是建一個兩倍大的table,然后再一個個indexfor進去,如果你能讓你的HashMap不需要重構那么多次,效率會大大提高!
[參考文獻]
[1]飛思科技產品研發中心.《Java 2應用開發指南》.電子工業出版社.
[2]王亞平.《數據庫系統工程師教程》.清華大學出版社.
[3]肖軍模.《程序設計語言編譯方法》.大連理工大學出版社.