欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-25 21:38:03
废话不多说,就说一句:在 JFinal 中集成 EhCache,可以提高系统的并发访问速度。 可能有人会问 JFinal 是什么,EhCache 是什么,简单解释一下。 JFinal 是一个基于Java 语言的极速 Web 开发框架,用起来非常爽,谁用谁知道。EhCache 是一个纯 Java 的进 ......

废话不多说,就说一句:在 jfinal 中集成 ehcache,可以提高系统的并发访问速度。

可能有人会问 jfinal 是什么,ehcache 是什么,简单解释一下。

jfinal 是一个基于java 语言的极速 web 开发框架,用起来非常爽,谁用谁知道。ehcache 是一个纯 java 的进程内缓存框架,具有快速、精干的特点,用起来非常爽,谁用谁知道。

jfinal 本身已经集成了 ehcache 这个缓存插件,但默认是没有启用的。那怎么启用呢?

请随我来。

01、在 pom.xml 中加入 ehcache 依赖

<dependency>
    <groupid>net.sf.ehcache</groupid>
    <artifactid>ehcache-core</artifactid>
    <version>2.6.11</version>
</dependency>

02、在 jfinalconfig 中配置 ehcacheplugin

public class democonfig extends jfinalconfig {
  public void configplugin(plugins me) {
    me.add(new ehcacheplugin());
  }
}

基于 jfinal 的 web 项目需要创建一个继承自 jfinalconfig 类的子类,该类用于对整个 web 项目进行配置。

03、添加 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 属性,默认为 false

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,因为此时该数据已经被移出缓存了。

04、使用 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;
}

05、最后

当数据的查询频率很高,远大于修改的频率,就要使用缓存了,这可以在很大程度上提高系统的性能。那现在我就提一个问题了,假如现在要修改一下数据,是先更新 db,还是先更新缓存呢?

谢谢大家的阅读,原创不易,喜欢就点个赞,这将是我最强的写作动力。如果你觉得文章对你有所帮助,也蛮有趣的,就关注一下我的公众号,谢谢。