首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以动态更改myBatis自己的缓存实现中的flushInterval值

是否可以动态更改myBatis自己的缓存实现中的flushInterval值
EN

Stack Overflow用户
提问于 2016-02-08 14:59:26
回答 1查看 978关注 0票数 1

在两种情况下,我希望刷新间隔为300000 (5分钟),在某些情况下,我根本不希望刷新间隔,即,我希望缓存在整个会话期间保持不变,即,我希望禁用刷新,类似地,如果我释放冻结,它应该在每5分钟后再次操作。

代码语言:javascript
复制
                  <cache
                  eviction="FIFO"
                  flushInterval="300000"
                  size="512"
                  readOnly="true"/>


   <select id="getStoreIdAndEqId"  resultType="String" flushCache="false"  useCache="true">
           select count(author) from blog
        </select>

我使用的技术是MyBatis和Spring。

EN

回答 1

Stack Overflow用户

发布于 2016-02-09 15:02:14

所以,我调试了一下,不幸的是,你的问题的答案是...“有点”...

当我使用你的缓存配置时,我得到了下面的缓存结构(通过Configuration.MappedStatement( ID ).Cache ):

将缓存委托给LogingCacheSynchronizedCache,后者将缓存委托给ScheduledCache,后者将缓存委托给FifoCache,后者将缓存委托给PerpetualCache。这些委托中的每一个都做了一些工作(日志记录等)。然后委托剩下的。

不幸的是,似乎没有一种“正常”的方法来获取SynchronizedCache的委托,而且该类也没有提供修改底层Cache对象设置的方法。当然,您可以使用反射来获取它们,但这不是一个好主意。因此,我看不到使用默认缓存的方法。

这就引出了“某种”的答案。您可以编写自己的Cache实现,例如MyCacheImpl,来完成这项工作,并通过...

代码语言:javascript
复制
<cache type="com.example.MyCacheImpl"/>

不幸的是,它将被包装在一个LoggingCache (委托给它)中,而且,您猜对了,LoggingCache也不提供获取委托的方法。因此,您可能必须在那里做一些工作,例如,通过在静态HashMap或类似的东西中注册缓存。当然,这很容易打开一个完整的bug罐头,所以要小心。当你这样做的时候,你可以直接访问你的缓存,并调用你想要的任何行为改变方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35263941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档