同じクラスで@Cacheableキャッシュが機能しません
一、問題の説明
環境: springboot 2.1.2.RELEASE ehcache 2.10.6
以下のように、
二、参考解決方法
問題の原因:
注記@CacheableはAOPエージェントを使用して実装されており、内部クラスを作成することによってキャッシュメソッドがエージェントされるため、クラス内部のメソッド呼び出しクラス内部のキャッシュメソッドはエージェントを移動しないため、キャッシュを正常に作成できないため、毎回データベースを呼び出す必要がある.
参考解決方法:
メソッド1:キャッシュされたメソッドを1つのクラスに個別に配置し、呼び出されたメソッドとは別に、同じクラスに配置しません.方法2:ApplicationContextから現在のクラスのエージェントオブジェクトを取得する.
方法1コードを貼らないで、方法2参考コードは以下の通りです.
環境:
以下のように、
selectAll()
メソッドでは@Cacheable
によってキャッシュが設定されており、get(String paramKey)
メソッドでは、selectAll()
を呼び出すときにキャッシュは使用されません.ただし、他のクラスがselectAll()メソッドを呼び出す場合、キャッシュは有効です.
@Service
public class SystemConfigService{
@Autowired
private SystemConfigMapper systemConfigMapper;
public SystemConfig get(String paramKey) {
// selectAll ,selectAll
List<SystemConfig> list =selectAll();
}
@Cacheable(cacheNames = "dict")
public List<SystemConfig> selectAll() {
return systemConfigMapper.selectAll();
}
}
二、参考解決方法
問題の原因:
注記@CacheableはAOPエージェントを使用して実装されており、内部クラスを作成することによってキャッシュメソッドがエージェントされるため、クラス内部のメソッド呼び出しクラス内部のキャッシュメソッドはエージェントを移動しないため、キャッシュを正常に作成できないため、毎回データベースを呼び出す必要がある.
参考解決方法:
メソッド1:キャッシュされたメソッドを1つのクラスに個別に配置し、呼び出されたメソッドとは別に、同じクラスに配置しません.方法2:ApplicationContextから現在のクラスのエージェントオブジェクトを取得する.
方法1コードを貼らないで、方法2参考コードは以下の通りです.
@Service
public class SystemConfigService{
@Autowired
private SystemConfigMapper systemConfigMapper;
//
@Autowired
private SystemConfigService _this;
public SystemConfig get(String paramKey) {
//
List list = _this.selectAll();
}
@Cacheable(cacheNames = CacheConstant.ONE_HOUR)
public List selectAll() {
return systemConfigMapper.selectAll();
}
}