diff --git a/src/main/java/neatlogic/framework/dao/cache/NeatLogicConcurrentSafeCache.java b/src/main/java/neatlogic/framework/dao/cache/NeatLogicConcurrentSafeCache.java index 60411433a3d81dace4a4214bf801a22afbe1837d..3784cca931030b9fb697198c6b8985b8c0957819 100644 --- a/src/main/java/neatlogic/framework/dao/cache/NeatLogicConcurrentSafeCache.java +++ b/src/main/java/neatlogic/framework/dao/cache/NeatLogicConcurrentSafeCache.java @@ -19,11 +19,10 @@ import neatlogic.framework.asynchronization.threadlocal.TenantContext; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; +import net.sf.ehcache.config.CacheConfiguration; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.cache.Cache; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.List; import java.util.concurrent.ConcurrentHashMap; @@ -35,8 +34,6 @@ import java.util.concurrent.locks.ReentrantLock; * 高并发场景下,防止缓存击穿 */ public class NeatLogicConcurrentSafeCache implements Cache { - - private final static Logger logger = LoggerFactory.getLogger(NeatLogicConcurrentSafeCache.class); /** * The cache manager reference. */ @@ -76,12 +73,20 @@ public class NeatLogicConcurrentSafeCache implements Cache { } if (StringUtils.isNotBlank(tenant)) { if (!CACHE_MANAGER.cacheExists(tenant + ":" + id)) { - CACHE_MANAGER.addCache(tenant + ":" + id); + Ehcache ehcache = CACHE_MANAGER.addCacheIfAbsent(tenant + ":" + id); + CacheConfiguration cacheConfiguration = ehcache.getCacheConfiguration(); + // 缓存5分钟 + cacheConfiguration.setTimeToIdleSeconds(300); + cacheConfiguration.setTimeToLiveSeconds(300); } return CACHE_MANAGER.getEhcache(tenant + ":" + id); } else { if (!CACHE_MANAGER.cacheExists(id)) { - CACHE_MANAGER.addCache(id); + Ehcache ehcache = CACHE_MANAGER.addCacheIfAbsent(id); + CacheConfiguration cacheConfiguration = ehcache.getCacheConfiguration(); + // 缓存5分钟 + cacheConfiguration.setTimeToIdleSeconds(300); + cacheConfiguration.setTimeToLiveSeconds(300); } return CACHE_MANAGER.getEhcache(id); } @@ -98,7 +103,7 @@ public class NeatLogicConcurrentSafeCache implements Cache { if (CollectionUtils.isNotEmpty(keys)) { for (Object key : keys) { ReentrantLock lock = LOCAL_LOCK_MAP.remove(generateLockKey(getId(), key)); - if (lock != null) { + if (lock != null && lock.isLocked()) { lock.unlock(); } } @@ -130,7 +135,9 @@ public class NeatLogicConcurrentSafeCache implements Cache { } cachedElement = getCache().get(key); if (cachedElement != null) { - lock.unlock(); + if (lock.isLocked()) { + lock.unlock(); + } return cachedElement.getObjectValue(); } return null; diff --git a/src/main/java/neatlogic/framework/dao/mapper/LoginMapper.xml b/src/main/java/neatlogic/framework/dao/mapper/LoginMapper.xml index 9bc2424f26344ca34115e432e9ad5662d0846960..7cdd84155f5cb7742f3edec06489b6b12163fd27 100644 --- a/src/main/java/neatlogic/framework/dao/mapper/LoginMapper.xml +++ b/src/main/java/neatlogic/framework/dao/mapper/LoginMapper.xml @@ -16,7 +16,7 @@ along with this program. If not, see .--> - + SELECT diff --git a/src/main/java/neatlogic/framework/dao/plugin/SqlCostInterceptor.java b/src/main/java/neatlogic/framework/dao/plugin/SqlCostInterceptor.java index 73e6e3ac1d286f1f7afa088a8203b55bc67731c8..c46638d003b3ce08a6e6d31e9b142c09a0e6e5d0 100644 --- a/src/main/java/neatlogic/framework/dao/plugin/SqlCostInterceptor.java +++ b/src/main/java/neatlogic/framework/dao/plugin/SqlCostInterceptor.java @@ -120,6 +120,23 @@ public class SqlCostInterceptor implements Interceptor { //System.out.println(sql); sqlAuditVo.setSql(sql); sqlAuditVo.setId(sqlId); + if (Objects.equals(invocation.getMethod().getName(), "query")) { + CacheKey key = null; + Executor executor = (Executor) invocation.getTarget(); + Object[] args = invocation.getArgs(); + if (args.length > 4) { + key = (CacheKey) args[4]; + } else if (args.length == 4) { + Object parameterObject = args[1]; + RowBounds rowBounds = (RowBounds) args[2]; + key = executor.createCacheKey(mappedStatement, parameterObject, rowBounds, mappedStatement.getBoundSql(parameterObject)); + } + if (mappedStatement.getCache() != null && mappedStatement.getCache().getObject(key) != null) { + sqlAuditVo.setUseCacheLevel("二级缓存"); + } else if (executor.isCached(mappedStatement, key)) { + sqlAuditVo.setUseCacheLevel("一级级缓存"); + } + } } } } catch (Exception e) { diff --git a/src/main/java/neatlogic/framework/dto/healthcheck/SqlAuditVo.java b/src/main/java/neatlogic/framework/dto/healthcheck/SqlAuditVo.java index 31a4b4ff407246d6f788e19d0c726e2404a94745..950092e3968479d593f9537c3e3b74a1de02bd11 100644 --- a/src/main/java/neatlogic/framework/dto/healthcheck/SqlAuditVo.java +++ b/src/main/java/neatlogic/framework/dto/healthcheck/SqlAuditVo.java @@ -36,6 +36,8 @@ public class SqlAuditVo extends BasePageVo { private String tenant; @EntityField(name = "用户", type = ApiParamType.STRING) private String userId; + @EntityField(name = "使用到的缓存级别", type = ApiParamType.STRING) + private String useCacheLevel; public String getId() { return id; @@ -92,4 +94,12 @@ public class SqlAuditVo extends BasePageVo { public void setRecordCount(int recordCount) { this.recordCount = recordCount; } + + public String getUseCacheLevel() { + return useCacheLevel; + } + + public void setUseCacheLevel(String useCacheLevel) { + this.useCacheLevel = useCacheLevel; + } } diff --git a/src/main/java/neatlogic/framework/fulltextindex/dao/mapper/FullTextIndexWordMapper.xml b/src/main/java/neatlogic/framework/fulltextindex/dao/mapper/FullTextIndexWordMapper.xml index 93f0ffe8ca34628c43aece6157bffdc671f3a279..129752b3d29ca1b35a18af556b1c2aafe7cd0732 100755 --- a/src/main/java/neatlogic/framework/fulltextindex/dao/mapper/FullTextIndexWordMapper.xml +++ b/src/main/java/neatlogic/framework/fulltextindex/dao/mapper/FullTextIndexWordMapper.xml @@ -16,7 +16,7 @@ along with this program. If not, see .--> - +