这个问题与我的另一个问题有关
我正在构建一个使用休眠从数据库读取数据的 Spring Web 应用程序。我的应用程序不会知道对数据库所做的任何更改(更新/插入)。在这种情况下有没有办法使用查询缓存?
我配置了查询缓存,当我从不同的应用程序更新数据库时,它不会使缓存失效。我认为这是预期的行为。
当数据库中有更新时,我需要缓存查询并使其失效。如何做到这一点?
我不确定是否有任何自动刷新缓存的方法。但我在上一个项目中解决了这个问题。公开如下方法并授予管理员访问权限。一旦在 DB 中完成任何修改,外部调用此方法来刷新缓存。
public void refreshCache()
{
try {
Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
for (String entityName : classesMetadata.keySet()) {
sessionFactory.evictEntity(entityName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
好吧,如果您使用的是 Oracle,以下命令将为您提供表上最后更新的唯一 scn
select max(ora_rowscn) from TableName;
输出
10772982279880
如果需要,您可以进一步将其转换为时间戳
select scn_to_timestamp(10772982279880) from dual
但我认为您不需要将其转换为时间,只需单独缓存rowscn并定期检查表,如果有变化您可以驱逐缓存区域。
Please note that this supports version > 10g