From 4e91b28a66b629194a6b784343d4376ee4e8673b Mon Sep 17 00:00:00 2001 From: Jan Bols Date: Thu, 19 Jul 2018 10:36:18 +0200 Subject: [PATCH 1/2] Cache assets when finding them by tenant and name cfr the caching of devices. --- .../server/common/data/CacheConstants.java | 1 + .../server/dao/asset/AssetService.java | 2 +- .../server/dao/asset/BaseAssetService.java | 29 ++++++++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/CacheConstants.java b/common/data/src/main/java/org/thingsboard/server/common/data/CacheConstants.java index 88f76313f2..21de402721 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/CacheConstants.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/CacheConstants.java @@ -19,4 +19,5 @@ public class CacheConstants { public static final String DEVICE_CREDENTIALS_CACHE = "deviceCredentials"; public static final String RELATIONS_CACHE = "relations"; public static final String DEVICE_CACHE = "devices"; + public static final String ASSET_CACHE = "assets"; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/AssetService.java b/dao/src/main/java/org/thingsboard/server/dao/asset/AssetService.java index 6dc15c0017..e373f0e27a 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/asset/AssetService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/asset/AssetService.java @@ -34,7 +34,7 @@ public interface AssetService { ListenableFuture findAssetByIdAsync(AssetId assetId); - Optional findAssetByTenantIdAndName(TenantId tenantId, String name); + Asset findAssetByTenantIdAndName(TenantId tenantId, String name); Asset saveAsset(Asset asset); diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java index 1eafb07442..6c8b60914e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/asset/BaseAssetService.java @@ -21,6 +21,10 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.Customer; @@ -48,15 +52,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; +import static org.thingsboard.server.common.data.CacheConstants.ASSET_CACHE; import static org.thingsboard.server.dao.DaoUtil.toUUIDs; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; -import static org.thingsboard.server.dao.service.Validator.validateId; -import static org.thingsboard.server.dao.service.Validator.validateIds; -import static org.thingsboard.server.dao.service.Validator.validatePageLink; -import static org.thingsboard.server.dao.service.Validator.validateString; +import static org.thingsboard.server.dao.service.Validator.*; @Service @Slf4j @@ -75,6 +76,9 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ @Autowired private CustomerDao customerDao; + @Autowired + private CacheManager cacheManager; + @Override public Asset findAssetById(AssetId assetId) { log.trace("Executing findAssetById [{}]", assetId); @@ -89,13 +93,16 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ return assetDao.findByIdAsync(assetId.getId()); } + @Cacheable(cacheNames = ASSET_CACHE, key = "{#tenantId, #name}") @Override - public Optional findAssetByTenantIdAndName(TenantId tenantId, String name) { + public Asset findAssetByTenantIdAndName(TenantId tenantId, String name) { log.trace("Executing findAssetByTenantIdAndName [{}][{}]", tenantId, name); validateId(tenantId, INCORRECT_TENANT_ID + tenantId); - return assetDao.findAssetsByTenantIdAndName(tenantId.getId(), name); + return assetDao.findAssetsByTenantIdAndName(tenantId.getId(), name) + .orElse(null); } + @CacheEvict(cacheNames = ASSET_CACHE, key = "{#asset.tenantId, #asset.name}") @Override public Asset saveAsset(Asset asset) { log.trace("Executing saveAsset [{}]", asset); @@ -122,6 +129,14 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ log.trace("Executing deleteAsset [{}]", assetId); validateId(assetId, INCORRECT_ASSET_ID + assetId); deleteEntityRelations(assetId); + + Cache cache = cacheManager.getCache(ASSET_CACHE); + Asset asset = assetDao.findById(assetId.getId()); + List list = new ArrayList<>(); + list.add(asset.getTenantId()); + list.add(asset.getName()); + cache.evict(list); + assetDao.removeById(assetId.getId()); } From fb294561e6403c2afdace8f6629776057c8c72c6 Mon Sep 17 00:00:00 2001 From: Jan Bols Date: Thu, 19 Jul 2018 11:21:04 +0200 Subject: [PATCH 2/2] Cache assets when finding them by tenant and name cfr the caching of devices => add asset in cache directives of config files --- application/src/main/resources/thingsboard.yml | 3 +++ dao/src/test/resources/application-test.properties | 3 +++ 2 files changed, 6 insertions(+) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 2a2728dbb4..89dde0ae51 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -291,6 +291,9 @@ caffeine: devices: timeToLiveInMinutes: 1440 maxSize: 100000 + assets: + timeToLiveInMinutes: 1440 + maxSize: 100000 redis: # standalone or cluster diff --git a/dao/src/test/resources/application-test.properties b/dao/src/test/resources/application-test.properties index f2dab45491..20cf91c3dd 100644 --- a/dao/src/test/resources/application-test.properties +++ b/dao/src/test/resources/application-test.properties @@ -21,6 +21,9 @@ caffeine.specs.deviceCredentials.maxSize=100000 caffeine.specs.devices.timeToLiveInMinutes=1440 caffeine.specs.devices.maxSize=100000 +caffeine.specs.assets.timeToLiveInMinutes=1440 +caffeine.specs.assets.maxSize=100000 + caching.specs.devices.timeToLiveInMinutes=1440 caching.specs.devices.maxSize=100000