若是有人問你 JFinal 如何集成 EhCache,把這篇文章甩給他

廢話很少說,就說一句:在 JFinal 中集成 EhCache,能夠提升系統的併發訪問速度。php

可能有人會問 JFinal 是什麼,EhCache 是什麼,簡單解釋一下。java

JFinal 是一個基於Java 語言的極速 Web 開發框架,用起來很是爽,誰用誰知道。EhCache 是一個純 Java 的進程內緩存框架,具備快速、精幹的特色,用起來很是爽,誰用誰知道。sql

JFinal 自己已經集成了 EhCache 這個緩存插件,但默認是沒有啓用的。那怎麼啓用呢?數據庫

請隨我來。緩存

0一、在 pom.xml 中加入 EhCache 依賴

<dependency>
	<groupId>net.sf.ehcache</groupId>
	<artifactId>ehcache-core</artifactId>
	<version>2.6.11</version>
</dependency>
複製代碼

0二、在 JFinalConfig 中配置 EhCachePlugin

public class DemoConfig extends JFinalConfig {
  public void configPlugin(Plugins me) {
    me.add(new EhCachePlugin());
  }
}
複製代碼

基於 JFinal 的 Web 項目須要建立一個繼承自 JFinalConfig 類的子類,該類用於對整個 Web 項目進行配置。併發

0三、添加 ehcache.xml

在項目的 src 目錄 / resources 目錄下添加 ehcache.xml 文件,該文件的初始內容以下所示。框架

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false" monitoring="autodetect" dynamicConfig="true">

    <diskStore path="java.io.tmpdir"/>

	<defaultCache maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" statistics="false">
		<persistence strategy="localTempSwap"/>
	</defaultCache>
    
</ehcache>
複製代碼

簡單解釋一下經常使用的配置項,不然你們在配置的時候容易猶豫不決。工具

1)maxEntriesLocalHeap:內存中最大緩存對象數性能

2)eternal:true 表示對象永不過時,此時會忽略 timeToIdleSeconds 和 timeToLiveSeconds 屬性,默認爲 falsespa

3)timeToIdleSeconds:對象最近一次被訪問後的閒置時間,若是閒置的時間超過了 timeToIdleSeconds 屬性值,這個對象就會過時,EhCache 將把它從緩存中清空;即緩存被建立後,最後一次訪問時間到緩存失效的時候之間的間隔,單位爲秒(s)

4)timeToLiveSeconds:對象被存放到緩存中後存活時間,若是存活時間超過了 timeToLiveSeconds 屬性值,這個對象就會過時,EhCache 將把它從緩存中清除;即緩存被建立後,可以存活的最長時間,單位爲秒(s)

假如咱們如今增長如下配置:

<cache name="keywordsCache" maxEntriesLocalHeap="500" eternal="false" overflowToDisk="true" diskPersistent="true" timeToIdleSeconds="300" timeToLiveSeconds="600">
</cache>
複製代碼

結合以前的默認緩存配置,再來對比介紹下,你們就徹底掌握了。

1)name 爲該緩存的名字,後續使用緩存的時候要用到。

2)overflowToDisk:true 表示內存中緩存的對象數目達到了 maxEntriesLocalHeap 界限後,會把溢出的對象寫到硬盤緩存中。此時的對象必須實現要實現 Serializable 接口(爲何?歡迎查看我之前的文章 Java Serializable:明明就一個空的接口嘛)。

3)diskPersistent:是否緩存虛擬機重啓時的數據

再來理解一下 timeToIdleSeconds 和 timeToLiveSeconds 這兩個配置項。

timeToIdleSeconds="300"
timeToLiveSeconds="600"
複製代碼

以上表示,一個數據被添加進緩存後,該數據可以在緩存中存活的最長時間爲 600 秒()timeToLiveSeconds);在這 600 秒內,假設不止一次去緩存中取該數據,那麼相鄰 2 次獲取數據的時間間隔若是小於 300 秒(timeToIdleSeconds),則能成功獲取到數據;但若是最近一次獲取到下一次獲取的時間間隔超過了 300 秒,那麼,將獲得 null,由於此時該數據已經被移出緩存了。

0四、使用 CacheKit 操做緩存

CacheKit 類是 JFinal 提供的緩存操做工具類,使用起來很是簡便。

Map<String, Keywords> map = CacheKit.get("keywordsCache", "keywordMap");
if (map == null) {
	map = new HashMap<>();

	List<Keywords> keywordList = dao.findAll();
	for (Keywords item : keywordList) {
		map.put(item.getKeyword(), item);
	}

	CacheKit.put("keywordsCache", "keywordMap", map);
}
複製代碼

CacheKit 中有兩個最重要的方法:

1)get(String cacheName, Object key),從 cache 中取數據。

2)put(String cacheName, Object key, Object value) ,將數據放入 cache 中。

參數 cacheName 與 ehcache.xml 中的 <cache name="keywordsCache" …> name 屬性值對應,這個很好理解。

參數 key 是指取值用到的 key;參數 value 是被緩存的數據,這個其實也好理解。好比在上面的代碼中,咱們使用了 keywordsCache 這個配置項,在裏面放了一個 HashMap,key 爲 keywordMap,value 就是 map 這個對象。

JFinal 內部提供了不少使用 Ehcache 的工具方法,好比:

List<Keywords> keywordList = dao.findByCache("keywordsCache", "keywordList", "select * from keywords");
複製代碼

這段代碼的做用就是,當咱們要從數據庫中查詢 Keywords 的時候,先從 Ehcache 緩存中取,若是緩存失效的話,再從數據庫中取。

我是怎麼知道的呢?固然不是靠猜的,咱們來看一下源碼。

public List<M> findByCache(String cacheName, Object key, String sql, Object... paras) {
	Config config = _getConfig();
	ICache cache = config.getCache();
	List<M> result = cache.get(cacheName, key);
	if (result == null) {
		result = find(config, sql, paras);
		cache.put(cacheName, key, result);
	}
	return result;
}
複製代碼

0五、最後

當數據的查詢頻率很高,遠大於修改的頻率,就要使用緩存了,這能夠在很大程度上提升系統的性能。那如今我就提一個問題了,假如如今要修改一下數據,是先更新 DB,仍是先更新緩存呢?

謝謝你們的閱讀,原創不易,喜歡就點個贊,這將是我最強的寫做動力。若是你以爲文章對你有所幫助,也蠻有趣的,就關注一下個人公衆號,謝謝。

PS:偷偷地告訴你,後臺回覆「Java」還可領取價值 399 元的 Java 進階資料,噓。

相關文章
相關標籤/搜索