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> CACHED_TABLE_SUFFIX_BY_TABLE_NAME = 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 getShardingInfoByTenantId(Long tenantId) { if(CACHED_TABLE_SUFFIX_BY_TENANT == null) { loadCacheTableShardingInfo(); } return CACHED_TABLE_SUFFIX_BY_TENANT.get(tenantId); } private synchronized void loadCacheTableShardingInfo() { if(CACHED_TABLE_SUFFIX_BY_TENANT != null && CACHED_TABLE_SUFFIX_BY_TABLE_NAME != null) { return; } List dataList = this.shardingInfoRepository.findListBySql("1=1"); Map> tempData = new HashMap>(); Map> tempDataTableName = new HashMap>(); for(ShardingInfoEntity item: dataList) { List tempItem = tempData.getOrDefault(item.getTenantId(), new ArrayList()); tempItem.add(item); tempData.put(item.getTenantId(), tempItem); List tempItemTableName = tempDataTableName.getOrDefault(item.getTableName(), new ArrayList()); tempItemTableName.add(item); tempDataTableName.put(item.getTableName(), tempItemTableName); } CACHED_TABLE_SUFFIX_BY_TENANT = tempData; CACHED_TABLE_SUFFIX_BY_TABLE_NAME = tempDataTableName; } private synchronized void loadShardingKeyGenerator(String tableName) { if(GENERATOR_HOLDER.containsKey(tableName)) { return; } ShardingKeyGeneratorExt generator = new ShardingKeyGeneratorImpl(); generator.loalConfig(config); GENERATOR_HOLDER.put(tableName, generator); } public List getShardingInfoByTableNames(String[] broadcastTableNames) { if(broadcastTableNames == null || broadcastTableNames.length == 0) { return null; } if(CACHED_TABLE_SUFFIX_BY_TABLE_NAME == null) { loadCacheTableShardingInfo(); } List dataList = new ArrayList(); for(String item: broadcastTableNames) { List tempData = CACHED_TABLE_SUFFIX_BY_TABLE_NAME.get(item); if(tempData != null && !tempData.isEmpty()) { dataList.addAll(tempData); } } return dataList; } }