若是有人问你 JFinal 如何集成 EhCache,把这篇文章甩给他

废话很少说,就说一句:在 JFinal 中集成 EhCache,能够提升系统的并发访问速度。html

可能有人会问 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,仍是先更新缓存呢?

谢谢你们的阅读,原创不易,喜欢就点个赞,这将是我最强的写做动力。若是你以为文章对你有所帮助,也蛮有趣的,就关注一下个人公众号,谢谢。

 

原文出处:https://www.cnblogs.com/qing-gee/p/11634429.html