在两种情况下,我希望刷新间隔为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。
发布于 2016-02-09 15:02:14
所以,我调试了一下,不幸的是,你的问题的答案是...“有点”...
当我使用你的缓存配置时,我得到了下面的缓存结构(通过Configuration.MappedStatement( ID ).Cache ):
将缓存委托给LogingCache的SynchronizedCache,后者将缓存委托给ScheduledCache,后者将缓存委托给FifoCache,后者将缓存委托给PerpetualCache。这些委托中的每一个都做了一些工作(日志记录等)。然后委托剩下的。
不幸的是,似乎没有一种“正常”的方法来获取SynchronizedCache的委托,而且该类也没有提供修改底层Cache对象设置的方法。当然,您可以使用反射来获取它们,但这不是一个好主意。因此,我看不到使用默认缓存的方法。
这就引出了“某种”的答案。您可以编写自己的Cache实现,例如MyCacheImpl,来完成这项工作,并通过...
<cache type="com.example.MyCacheImpl"/>不幸的是,它将被包装在一个LoggingCache (委托给它)中,而且,您猜对了,LoggingCache也不提供获取委托的方法。因此,您可能必须在那里做一些工作,例如,通过在静态HashMap或类似的东西中注册缓存。当然,这很容易打开一个完整的bug罐头,所以要小心。当你这样做的时候,你可以直接访问你的缓存,并调用你想要的任何行为改变方法。
https://stackoverflow.com/questions/35263941
复制相似问题