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

Orm 是否可以在myBatis自己的缓存实现中动态更改flushInterval值,orm,mybatis,ibatis,spring-mybatis,Orm,Mybatis,Ibatis,Spring Mybatis,有两种情况,我希望刷新间隔为300000 5分钟,在某些情况下,我根本不希望刷新间隔,即我希望我的缓存在整个会话期间保持不变,即我希望禁用刷新,同样,如果我释放冻结,它应在每5分钟后再次运行 <cache eviction="FIFO" flushInterval="300000" size="512" read

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

因此,我进行了一些调试,不幸的是,您的问题的答案是。。。有点

当我使用缓存配置时,我会通过configuration.MappedStatement ID.cache获得以下缓存结构:

一种同步缓存,将缓存委托给登录缓存,登录缓存将缓存委托给ScheduledCache,ScheduledCache将缓存委托给FifoCache,FifoCache将缓存委托给永久缓存。这些代表中的每一位都会做一点工作,如日志记录等,然后再代表其他人

不幸的是,似乎没有正常的方法获得SynchronizedCache的委托,该类也没有提供修改底层缓存对象设置的方法。当然,你可以使用反射来获得它们,但这不是一个好主意。所以,我不认为使用默认缓存可以做到这一点

这让我们找到了答案。。。您可以编写自己的缓存实现,例如MyCacheImpl,来完成这项工作,并通过

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

不幸的是,它将被包装在一个LoggingCache中,委托给它,而且,您猜对了,LoggingCache也没有提供获取委托的方法。因此,您可能需要在这里做一些变通,例如在静态哈希映射或类似的东西中注册缓存。当然,这很容易打开一整罐虫子,所以小心点。当您这样做时,您可以直接访问缓存并调用任何您想要的行为改变方法。

您可以通过映射语句获取缓存,我建议您只需查看它们,找出缓存关闭的类,也许您会找到一个方法来更改这些值。我没有完全理解。缓存实现对我的映射语句运行良好。但问题是我想刷新缓存,并根据我在单个会话的不同阶段的要求更改刷新间隔。例如:我想要缓存从现在到时间开始点击一个按钮,然后我松开按钮,15分钟后我再次打开切换按钮,现在我想要从现在开始+15分钟到时间开始的数据,但我得到的只是现在到时间开始的数据。谢谢Florian,这很有帮助。除此之外,我还有一个问题:假设我在mapper标签中还有一个select*from blog。因此,在这种情况下,是否可以让getStoreIdAndEqId引用现有getWholeData缓存而不命中db并获取新数据。我在跟踪器上看到了您的问题,但不,我认为这不太可能,由于MyBatis无法知道查询列表A的大小是查询B的整数结果。MyBatis实际上并不解析查询,它只是发送查询。您可以编写一个自定义缓存实现,但这似乎有些过头了。啊!知道了。这让我想到了更多事关业绩的问题。我想我需要一些架构方面的建议。虽然我可以帮助您查看我的个人资料,以链接到我的hp或twitter,但这个网站的想法是提供答案,因此,在这里或姐妹网站上提出这些问题可能是一个好主意。是的,我知道了,但我认为休息可能会很模糊,可能会很长: