diff --git a/cmdb-core/src/main/java/com/webank/cmdb/cache/CacheHandlerInterceptor.java b/cmdb-core/src/main/java/com/webank/cmdb/cache/CacheHandlerInterceptor.java new file mode 100644 index 000000000..0fb2367ed --- /dev/null +++ b/cmdb-core/src/main/java/com/webank/cmdb/cache/CacheHandlerInterceptor.java @@ -0,0 +1,28 @@ +package com.webank.cmdb.cache; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +public class CacheHandlerInterceptor extends HandlerInterceptorAdapter{ + + @Autowired + private RequestScopedCacheManager requestScopedCacheManager; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + requestScopedCacheManager.clearCaches(); + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, + ModelAndView modelAndView) throws Exception { + requestScopedCacheManager.clearCaches(); + } + +} diff --git a/cmdb-core/src/main/java/com/webank/cmdb/cache/RequestScopedCacheManager.java b/cmdb-core/src/main/java/com/webank/cmdb/cache/RequestScopedCacheManager.java new file mode 100644 index 000000000..e6a1fb1f4 --- /dev/null +++ b/cmdb-core/src/main/java/com/webank/cmdb/cache/RequestScopedCacheManager.java @@ -0,0 +1,47 @@ +package com.webank.cmdb.cache; + +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.concurrent.ConcurrentMapCache; +import org.springframework.stereotype.Component; + +@Component +public class RequestScopedCacheManager implements CacheManager { + + private static final ThreadLocal> threadLocalCache = new ThreadLocal>() { + @Override + protected Map initialValue() { + return new ConcurrentHashMap(); + } + }; + + @Override + public Cache getCache(String name) { + final Map cacheMap = threadLocalCache.get(); + Cache cache = cacheMap.get(name); + if (cache == null) { + cache = createCache(name); + cacheMap.put(name, cache); + } + return cache; + } + + private Cache createCache(String name) { + return new ConcurrentMapCache(name); + } + + @Override + public Collection getCacheNames() { + return threadLocalCache.get().keySet(); + } + + public void clearCaches() { + threadLocalCache.remove(); + } + +} + diff --git a/cmdb-core/src/main/java/com/webank/cmdb/config/SpringAppConfig.java b/cmdb-core/src/main/java/com/webank/cmdb/config/SpringAppConfig.java index 4402fcf96..61be9f327 100755 --- a/cmdb-core/src/main/java/com/webank/cmdb/config/SpringAppConfig.java +++ b/cmdb-core/src/main/java/com/webank/cmdb/config/SpringAppConfig.java @@ -12,7 +12,7 @@ @Configuration @EnableCaching -@ComponentScan({ "com.webank.cmdb.service", "com.webank.cmdb.mvc", "com.webank.cmdb.util" }) +@ComponentScan({ "com.webank.cmdb.service", "com.webank.cmdb.mvc", "com.webank.cmdb.util","com.webank.cmdb.cache" }) @Import({ DatabaseConfig.class }) @EnableConfigurationProperties({ ApplicationProperties.class ,DatasourceProperties.class, UIProperties.class, SecurityProperties.class}) public class SpringAppConfig { diff --git a/cmdb-core/src/main/java/com/webank/cmdb/repository/AdmBasekeyCodeRepository.java b/cmdb-core/src/main/java/com/webank/cmdb/repository/AdmBasekeyCodeRepository.java index 895e4fc15..7e2a4967d 100755 --- a/cmdb-core/src/main/java/com/webank/cmdb/repository/AdmBasekeyCodeRepository.java +++ b/cmdb-core/src/main/java/com/webank/cmdb/repository/AdmBasekeyCodeRepository.java @@ -2,6 +2,8 @@ import java.util.List; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; @@ -11,6 +13,8 @@ import com.webank.cmdb.domain.AdmBasekeyCode; +@CacheConfig(cacheManager = "requestScopedCacheManager", cacheNames = "admCiTypeAttr") +@Cacheable public interface AdmBasekeyCodeRepository extends JpaRepository { @Query(value = "select max(seq_no) from adm_basekey_code where id_adm_basekey_cat = :catId", nativeQuery = true) Integer getMaxSeqNoByCatId(@Param("catId") int catId); diff --git a/cmdb-core/src/main/java/com/webank/cmdb/repository/AdmCiTypeAttrRepository.java b/cmdb-core/src/main/java/com/webank/cmdb/repository/AdmCiTypeAttrRepository.java index e2a2ad1de..86cc6c875 100755 --- a/cmdb-core/src/main/java/com/webank/cmdb/repository/AdmCiTypeAttrRepository.java +++ b/cmdb-core/src/main/java/com/webank/cmdb/repository/AdmCiTypeAttrRepository.java @@ -2,12 +2,16 @@ import java.util.List; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import com.webank.cmdb.domain.AdmCiTypeAttr; +@CacheConfig(cacheManager = "requestScopedCacheManager", cacheNames = "admCiTypeAttr") +@Cacheable public interface AdmCiTypeAttrRepository extends JpaRepository { List findAllByCiTypeId(Integer ciTypeId);