JFinal EhCache使用和原理问题

最近在把之前研究JFinal源码的心得,细化下。

EhCache这块有个疑惑。

JFinal EhCache使用

JFinalClubConfig extends JFinalConfig{

  public void configPlugin(Plugins me) {

    // ActiveRecordPlugin中的ICache是固定的EhCache

    DruidPlugin druidPlugin = getDruidPlugin();

ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);

me.add(new EhCachePlugin());

     }

}

配置EhCachePlugin插件之后,

public boolean start() {

          createCacheManager();

          CacheKit.init(cacheManager);

          return true;

      }

CacheKit主要提供静态工具方法,可以理解为 “全局变量”,EhCachePlugin负责向里面写,其它地方从这里获取,然后使用。

    /**

     * 优先从缓存中获取 account 对象,可获取到被 block 的 account

     */

    public Account getById(int accountId) {

        // 优先从缓存中取,未命中缓存则从数据库取

        Account account = CacheKit.get(allAccountsCacheName, accountId);

       

        return account;

    }

问题1:

   缓存,可以有插件。

但是“缓存”这个概念,不应该是全局的么,比如 包的路径可以为

com.jfinal.cache。

CacheManager管理,按说也是全局的。

但实际上是 用的是ehcache 具体的实现类。


问题2:

activerecord插件,Config为啥直接使用写死的EhCache。

Config(String name, DataSource dataSource, int transactionLevel) {

init(name, dataSource, new MysqlDialect(), false, false, transactionLevel, IContainerFactory.defaultContainerFactory, new EhCache());

}



“EhCache”为啥放在activerecord的子包里,而非全局的包,比如jfinal.cache.echache


缓存的定义不应该是全局且通用的吗?

开发者自己的业务代码,JFinal框架内部的缓存。

让开发者自己指定实现。

换句话说,咱们的EhCachePlugin其实和JFinal框架绑定的比较紧。


不知道说清没。




    

评论区

fansunion

2018-08-17 17:30

如果想把JFinal底层的缓存,改为 Google Cache实现,不太行!。com.google.common.cache.Cache 自己业务的缓存,完全在自己控制之内,Redis、JVM本地,多种缓存、多级缓存,都可以很好地使用。

JFinal

2018-08-17 17:56

Ehcache 在 jfinal 中作为一个插件存在,在 ActiveRecordPlugin 这个插件中是依赖于 ICache 这个接口,并且为这个 ICache 这个接口提供了一个 ehcache 的默认实现

如果要说 jfinal 对 ehcache 绑得比较紧,只能说是 ActiveRecordPlugin 中的 ICache 接口设计对 ehcache 有所顾及,因为 ehcache 操作数据时需要 cacheName 与 key 两个参数

随着未来 cache 技术的发展,jfinal 的 ActiveRecordPlugin 会考虑对 ICache 做细微调整,例如将 cacheName、key 合并为一个参数 key

jfinal 整体上并没有 cache 接口与实现,仅仅只有 ActiveRecordPlugin 中有一个 ICache, 此外再提供了一个独立的 EhcachePlugin

JFinal

2018-08-17 17:58

@fansunion 你自己要做缓存,可以用拦截器来做,参考一下 com.jfinal.plugin.ehcache 的实现方法,里头有一个 CacheInterceptor 以及自定义的注解 @CacheName

JFinal

2018-08-17 18:02

最后,缓存 "不建议" 做到 model 层, service 层也不太建议直接做缓存,而是将缓存做成可插拔的独立组件,例如用拦截器在业务层或者控制层来做缓存

缓存做成控制层拦截器,性能是最好的,因为请求最早到达的是控制器,在控制器拦截器中就响应客户端缓存中的数据,时机是最早的

fansunion

2018-08-17 18:15

热门反馈

扫码入社