Web緩存是指一個Web資源(如html頁面,圖片,js,數據等)存在於Web服務器和客戶端(瀏覽器)之間的副本。緩存會根據進來的請求保存輸出內容的副本;當下一個請求來到的時候,若是是相同的URL,緩存會根據緩存機制決定是直接使用副本響應訪問請求,仍是向源服務器再次發送請求。比較常見的就是瀏覽器會緩存訪問過網站的網頁,當再次訪問這個URL地址的時候,若是網頁沒有更新,就不會再次下載網頁,而是直接使用本地緩存的網頁。只有當網站明確標識資源已經更新,瀏覽器纔會再次下載網頁。所以很好的使用緩存技術可以大大提升性能。html
在JFinal中,默認的緩存實現時使用EhCache。java
引入ehcache的jar包sql
在src包下新建ehcache.xml文件,裏面爲ehcache的基本配置數據庫
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false" monitoring="autodetect" dynamicConfig="true"> <!--指定一個文件,當ehcache把數據寫到硬盤上時,會默認把數據寫到該文件下--> <!--user.home - 用戶主目錄;user.dir - 用戶當前工做目錄;java.io.tmpdir - 默認臨時文件路徑。--> <diskStore path="java.io.tmpdir" /> <!-- 設定緩存的默認數據過時策略 --> <defaultCache maxElementsInMemory="10000" eternal="true" timeToIdleSeconds="3600" timeToLiveSeconds="3600" overflowToDisk="true"> </defaultCache> <!--自定義cache--> <cache name="cacheText" maxElementsInMemory="10000" maxElementsOnDisk="1000" eternal="false" overflowToDisk="true" timeToIdleSeconds="900" timeToLiveSeconds="1800" memoryStoreEvictionPolicy="LFU"> </cache> </ehcache>
關於ehcache的配置參數的詳解:https://blog.csdn.net/huitoukest/article/details/80047935瀏覽器
(1) 在UserController.class中建立一個Action:緩存
public void text(){ List<User> user = new User().dao().findByCache("cacheText","user1","select * from user"); setAttr("user1",user).render("index.html"); }
findByCache方法參數:服務器
(2)查看源碼網絡
這樣運行出來你可能仍是不理解Cache在其中究竟啓到了什麼樣的做用,下面咱們來看看 findByCache的具體實現方式:ide
public List<M> findByCache(String cacheName, Object key, String sql) { return this.findByCache(cacheName, key, sql, DbKit.NULL_PARA_ARRAY); } public M findFirstByCache(String cacheName, Object key, String sql, Object... paras) { ICache cache = this._getConfig().getCache(); M result = (Model)cache.get(cacheName, key); if (result == null) { result = this.findFirst(sql, paras); cache.put(cacheName, key, result); } return result; }
從具體實現代碼中,咱們能夠看出,調用findByCache方法後,首先會經過getCache() 來得到Cache的配置,而後根據傳入的參數從緩存中查詢數據,若是查詢到的result結果爲空,則經過sql語句在數據庫裏查詢,並將查詢的結果存入緩存之中。反之,若是查詢的結果不爲空,則直接返回result。性能
(3)關於具體實現,咱們還能夠經過打斷點,debug的方式來理解Cache的實現。
除了使用JFinal爲咱們提供的默認的ehcache緩存以外,咱們還能夠經過實現ICache接口,重寫ICache中的方法來自定義緩存。
package com.cache; import com.jfinal.plugin.activerecord.cache.ICache; public class idenCache implements ICache{ @Override public <T> T get(String s, Object o) { return null; } @Override public void put(String s, Object o, Object o1) { } @Override public void remove(String s, Object o) { } @Override public void removeAll(String s) { } }
使用自定義緩存時,在基本配置類中的configPlugin()方法中,可使用以下方式來對自定義緩存以及默認緩存進行切換。
除以上方法外,JFinal還提供了緩存插件可供使用。緩存雖能夠提升效率,可是當數據變換快時,則要謹慎使用。