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

时间:2016-02-08 06:59:26

标签: orm mybatis ibatis spring-mybatis

有两种情况我希望我的刷新间隔为300000(5分钟),在某些情况下我根本不想要刷新间隔,即我希望我的缓存在整个会话期间保持不变,即我希望刷新被禁用同样,如果我发布冻结,它应该每隔5分钟再次运行。

                  <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。

1 个答案:

答案 0 :(得分:0)

所以,我调试了一点,不幸的是,你的问题的答案是......&#34;有点&#34; ......

当我使用您的缓存配置时,我得到以下缓存结构(Configuration.MappedStatement( ID ).Cache):

SynchronizedCache委托缓存到LogingCache,委托缓存到ScheduledCache,委托缓存到FifoCache,委托缓存为{{} 1}}。这些代表中的每一个都做了一些工作(记录等),然后委托其余的。

不幸的是,似乎没有&#34;正常&#34;获取PerpetualCache的委托的方法,该类无法修改基础SynchronizedCache对象的设置。当然你可以使用反射来获得它们,但这不是一个好主意。所以,我没有看到使用默认缓存的方法。

这引导我们进入&#34;那种&#34;回答......你可以编写自己的Cache实现,例如Cache,来完成工作并通过...设置它。

MyCacheImpl

不幸的是,它将被包装在一个LoggingCache(委托给它)中,你猜对了,LoggingCache也没有提供获取委托的方法。因此,您可能需要在那里做一些解决方法,例如在静态HashMap中注册Caches或类似的东西。当然,这可以很容易地打开一大堆虫子,所以谨慎行事。执行此操作时,您可以直接访问缓存并调用所需的任何行为更改方法。