在一个@Transaction方法内,循环调用一个数据库读取操作。代码类似如下:
业务处理类中
@Transactional(rollbackFor = Exception.class)
public void proc(List<Info> infoList) {
//在infoList中,有很多供应商Id,Id存在很多重复的现像
for(Info info:infoList){
//对infoList循环,根据供应商Id取相应的供应商信息
supplierService.getById(info.getSupplierId());
//这里的读取效率很低,在这个方法签名上加@Cacheable,使用@Cacheable管理Redis缓存
//其它处理省略...
}
}
Service类中:
@Cacheable(value = "supplier", cacheManager = "myRedisCacheManager", key = "#id", unless = "#result == null")
public Supplier getById(Long id) {
log.debug("读数据库,id:{}",id);
//数据库查询代码省略
}
期望的结果:当一个supplierId被查询后,放入Redis缓存中,以后再次访问这个方法时,将直接从Redis中读取,,不会进入Service内的方法体。<