package com.taover.repository.shardingsphere; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.taover.repository.autoconfigure.ShardingSphereKeyGeneratorConfiguration; @Service public class ShardingSphereService { private Map> CACHED_TABLE_SUFFIX_BY_TENANT = null; private Map GENERATOR_HOLDER = new HashMap(); @Resource private ShardingInfoRepository shardingInfoRepository; private ShardingSphereKeyGeneratorConfiguration config; public ShardingSphereService(ShardingSphereKeyGeneratorConfiguration config) { this.config = config; } public List generateKeyList(String tableName, int number){ if(!GENERATOR_HOLDER.containsKey(tableName)) { loadShardingKeyGenerator(tableName); } return GENERATOR_HOLDER.get(tableName).generateKeyList(number); } public List getShardingInfoMapByTenantId(Long tenantId) { if(CACHED_TABLE_SUFFIX_BY_TENANT == null) { loadCacheTableShardingInfoByTenantId(); } return CACHED_TABLE_SUFFIX_BY_TENANT.get(tenantId); } private synchronized void loadCacheTableShardingInfoByTenantId() { if(CACHED_TABLE_SUFFIX_BY_TENANT != null) { return; } List dataList = this.shardingInfoRepository.findListBySql("1=1"); Map> tempData = new HashMap>(); for(ShardingInfoEntity item: dataList) { List tempItem = tempData.getOrDefault(item.getTenantId(), new ArrayList()); tempItem.add(item); tempData.put(item.getTenantId(), tempItem); } CACHED_TABLE_SUFFIX_BY_TENANT = tempData; } private synchronized void loadShardingKeyGenerator(String tableName) { if(GENERATOR_HOLDER.containsKey(tableName)) { return; } ShardingKeyGeneratorExt generator = new ShardingKeyGeneratorImpl(); generator.loalConfig(config); GENERATOR_HOLDER.put(tableName, generator); } }