本文主要講ssm框架整合EhCache。或許有人會問什麼是ehcache。html
關於EhCache的介紹和優劣,我想下面的解答足以讓讀者明白:前端
EhCache 是一個純Java的進程內緩存框架,具備快速、精幹等特色,是Hibernate中默認的CacheProvider。Ehcache是一種普遍使用的開 源Java分佈式緩存。主要面向通用緩存,Java EE和輕量級容器。它具備內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特色。java
優勢:
1. 快速
2. 簡單
3. 多種緩存策略
4. 緩存數據有兩級:內存和磁盤,所以無需擔憂容量問題
5. 緩存數據會在虛擬機重啓的過程當中寫入磁盤
6. 能夠經過RMI、可插入API等方式進行分佈式緩存
7. 具備緩存和緩存管理器的偵聽接口
8. 支持多緩存管理器實例,以及一個實例的多個緩存區域
9. 提供Hibernate的緩存實現mysql
缺點:
1. 使用磁盤Cache的時候很是佔用磁盤空間:這是由於DiskCache的算法簡單,該算法簡單也致使Cache的效率很是高。它只是對元素直接追加存儲。所以搜索元素的時候很是的快。若是使用DiskCache的,在很頻繁的應用中,很快磁盤會滿。
2. 不能保證數據的安全:當忽然kill掉java的時候,可能會產生衝突,EhCache的解決方法是若是文件衝突了,則重建cache。這對於Cache 數據須要保存的時候可能不利。固然,Cache只是簡單的加速,而不能保證數據的安全。若是想保證數據的存儲安全,可使用Bekeley DB Java Edition版本。這是個嵌入式數據庫。能夠確保存儲安全和空間的利用率。web
或許還有人很疑惑緩存,什麼是緩存?爲何須要緩存?算法
引用百度百科的回答:spring
緩存就是數據交換的緩衝區(稱做Cache),當某一硬件要讀取數據時,會首先從緩存中查找須要的數據,若是找到了則直接執行,找不到的話則從內存中找。因爲緩存的運行速度比內存快得多,故緩存的做用就是幫助硬件更快地運行。sql
由於緩存每每使用的是RAM(斷電即掉的非永久儲存),因此在用完後仍是會把文件送到硬盤等存儲器裏永久存儲。電腦裏最大的緩存就是內存條了,最快的是CPU上鑲的L1和L2緩存,顯卡的顯存是給顯卡運算芯片用的緩存,硬盤上也有16M或者32M的緩存。數據庫
或許還有人會問內存是什麼?express
引用百度百科的回答:
內存是計算機中重要的部件之一,它是與CPU進行溝通的橋樑。計算機中全部程序的運行都是在內存中進行的,所以內存的性能對計算機的影響很是大。內存(Memory)也被稱爲內存儲器,其做用是用於暫時存放CPU中的運算數據,以及與硬盤等外部存儲器交換的數據。只要計算機在運行中,CPU就會把須要運算的數據調到內存中進行運算,當運算完成後CPU再將結果傳送出來,內存的運行也決定了計算機的穩定運行。 內存是由內存芯片、電路板、金手指等部分組成的。
也許還人會罵我,說你怎麼盡引用百度百科。
個人回答是,由於我對此也不知道怎麼回答。
若是讓我回答在開發中爲何須要緩存及其緩存的做用,個人回答是,對於有些數據,我只需查詢一遍就能夠,不須要再度查詢,由於有緩存。就比如數據庫優化,除了索引以外,還有就是將數據庫裏面的數據緩存起來,這樣對於大規模數據,日常須要屢次查詢,致使耗費時間很長,性能差,可是我經過緩存,只需查詢一次,當再次查詢時,就很是快,對整個系統的響應和性能也不會有什麼影響。固然了,當涉及到緩存的數據與實際數據庫中的數據存在差別時,這裏後續會講採起怎樣的方式解決這個問題。
另外建議軟件開發的朋友們,有空多多去熟悉熟悉計算機相關的理論知識。正所謂有句話叫作:萬變不離其宗。這個其宗在計算機中能夠理解爲算法與數據結構、操做系統、TCP/IP、計算機基礎知識、編譯原理等等。把握好這些,編程之路才能越走越長。
這也是一位朋友對我說的。
下面進入正題,關於SSM框架整合EhCache
sql腳本準備
1、導入Maven依賴
2、編寫實體
3、編寫DAO
4、編寫業務接口類
5、編寫業務接口實現類
package com.blog.service.impl; import com.blog.entity.User; import com.blog.mapper.UserDao; import com.blog.service.UserService; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; /** * <p> * 服務實現類 * </p> * * @author youcong123 * @since 2018-07-22 */ @Service public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService { @Autowired private UserDao userDao; @Override @Cacheable(value="cacheTest") public User getUserById(String userId) { return userDao.selectById(userId); } @Override public User login(String loginCode) { User user = new User(); user.setLoginCode(loginCode); return userDao.selectOne(user); } } 6、編寫Controller package com.blog.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.blog.entity.User; import com.blog.service.UserService; import cn.hutool.json.JSONObject; /** * <p> * 前端控制器 * </p> * * @author youcong123 * @since 2018-07-22 */ @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping(value="getById",produces="application/json;charset=utf-8") public Object getById(String userId) { JSONObject json = new JSONObject(); User user = userService.getUserById(userId); json.put("user", user); return user; } }
7、編寫DAO對應的XML
UserDao.xml
8、編寫配置文件
spring.xml
spring-mybatis.xml
spring-mvc.xml
config.properties
ehcache-setting.xml
關於diskstore配置說明:
一、diskStore元素是可選的,非必須的。若是不使用磁盤存儲,只須要將diskStore註釋掉便可;若是使用,須要在ehcache.xml文件中的ehcahce元素下的定義一個diskStore元素並指定其path屬性。
二、由diskStore元素是定義在ehcache元素下咱們看出diskStore在CacheManager範圍內是共享的,其是線程安全的
三、對於任何緩存,若是你已經激活了overflowToDisk或diskPersistent,就要配置磁盤存儲器。
(關於overflowToDisk或diskPersistent的配置,詳見配置文件ehcache.xml詳解(1) )
四、DiskStore中驅除元素跟MemoryStore中驅除元素的規則是不同的。當往DiskStore中添加元素且此時DiskStore中的容量已經超出限制時將採用LFU(最不經常使用)驅除規則將對應的元素進行刪除,並且該驅除規則是不可配置的(經過cache中的diskExpiryThreadIntervalSeconds屬性完成)
五、path屬性若是是下述Java系統屬性之一,他將會被運行中的VM中的值替換。爲了向後兼容,這些應該被特別規定,而不會被${token}替換語法封閉。
六、path屬性能夠配置的目錄有:
user.home(用戶的家目錄)
user.dir(用戶當前的工做目錄)
java.io.tmpdir(默認的臨時目錄)
ehcache.disk.store.dir(ehcache的配置目錄)
絕對路徑(如:d://javastore)
mybatis-config.xml
log4j.properties
web.xml
9、運行項目,若是控制檯五報錯,就經過PostMan接口測試
PostMan可運行屢次 發現控制檯始終都只打印一次就表示緩存成功