1

在两种情况下,我希望我的刷新间隔为 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。

4

1 回答 1

1

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

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

ASynchronizedCache将缓存委托给 aLogingCache将缓存委托给 a 将ScheduledCache缓存委托给 a 将缓存FifoCache委托给 a PerpetualCache。这些委托中的每一个都做一点工作(记录等),然后委托其余的。

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

这将我们引向“那种”答案...您可以编写自己的Cache实现,例如MyCacheImpl,完成工作并通过...进行设置

<cache type="com.example.MyCacheImpl"/>

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

于 2016-02-09T07:02:13.797 回答