You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shardingsphere.apache.org by GitBox <gi...@apache.org> on 2019/03/05 03:35:53 UTC

[GitHub] [incubator-shardingsphere] linyuliang commented on issue #1967: Shard table name error when exec select sql in multi thread concurrent

linyuliang commented on issue #1967: Shard table name error when exec select sql in multi thread concurrent
URL: https://github.com/apache/incubator-shardingsphere/issues/1967#issuecomment-469523747
 
 
   I use sharding-jdbc for single database and sub-table。
   
   my sharding config file is sharding.yml :
   
   dataSources:
     shardingdb: !!org.apache.commons.dbcp.BasicDataSource
       driverClassName: org.mariadb.jdbc.Driver
       url: jdbc:mysql://Mysql:3306/test?useUnicode=true&characterEncoding=utf-8
       username: root
       password: rjbigdata
       initialSize: 3
       minIdle: 3
       maxIdle: 20
       maxActive: 100
       maxWait: 60000
       timeBetweenEvictionRunsMillis: 60000
       minEvictableIdleTimeMillis: 300000
       validationQuery: SELECT 1
       testWhileIdle: true
       testOnBorrow: true
       testOnReturn: false
       logAbandoned: true
       removeAbandoned: true
       removeAbandonedTimeout: 60
   
   shardingRule:
     tables:
   
       #新增的mysql表分片配置
       app_ap_offline_event:
         tableStrategy:
           standard:
         #精确分片算法类名称,用于=和IN
              preciseAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
         #范围分片算法类名称,用于BETWEEN,可选
              rangeAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
              shardingColumn: ymd
   
       app_network_flow_minute:
         tableStrategy:
           standard:
             #精确分片算法类名称,用于=和IN
             preciseAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             #范围分片算法类名称,用于BETWEEN,可选
             rangeAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             shardingColumn: ymd
   
       app_rrm_radio_link_quality:
         tableStrategy:
           standard:
             #精确分片算法类名称,用于=和IN
             preciseAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             #范围分片算法类名称,用于BETWEEN,可选
             rangeAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             shardingColumn: ymd
   
       app_sta_working_info_day:
         tableStrategy:
           #        inline:
           #          shardingColumn: ymd
           #          algorithmExpression: app_sta_working_info_day_${ymd}
           standard:
             #精确分片算法类名称,用于=和IN
             preciseAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             #范围分片算法类名称,用于BETWEEN,可选
             rangeAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             shardingColumn: ymd
       app_ap_offline_event_hour_stats:
         tableStrategy:
           standard:
             #精确分片算法类名称,用于=和IN
             preciseAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             #范围分片算法类名称,用于BETWEEN,可选
             rangeAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             shardingColumn: ymd
       app_sta_flow_info:
         tableStrategy:
           standard:
             #精确分片算法类名称,用于=和IN
             preciseAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             #范围分片算法类名称,用于BETWEEN,可选
             rangeAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             shardingColumn: ymd
       app_ap_offline_summary:
         tableStrategy:
           standard:
             #精确分片算法类名称,用于=和IN
             preciseAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             #范围分片算法类名称,用于BETWEEN,可选
             rangeAlgorithmClassName: com.ruijie.cloud.idata.api.sharding.DateStringStandardShardingAlgorithm
             shardingColumn: ymd
   
     bindingTables:
   
       #新增的mysql表需要规则绑定
       - app_ap_offline_event
       - app_network_flow_minute
       - app_rrm_radio_link_quality
       - app_sta_working_info_day
       - app_ap_offline_event_hour_stats
       - app_sta_flow_info
       - app_ap_offline_summary
   
   My DateStringStandardShardingAlgorithm.java:
   
   `import com.google.common.collect.Range;
   import io.shardingsphere.api.algorithm.sharding.PreciseShardingValue;
   import io.shardingsphere.api.algorithm.sharding.RangeShardingValue;
   import io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm;
   import io.shardingsphere.api.algorithm.sharding.standard.RangeShardingAlgorithm;
   import org.slf4j.Logger;
   import org.slf4j.LoggerFactory;
   
   import java.text.ParseException;
   import java.util.*;
   
   
   public class DateStringStandardShardingAlgorithm extends BaseShardingFilter implements PreciseShardingAlgorithm<String>, RangeShardingAlgorithm<String> {
       private static final Logger logger = LoggerFactory.getLogger(DateStringStandardShardingAlgorithm.class);
   
       @Override
       public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
   //*********************** shardingValue.getLogicTableName()  is error **************************
           return getTableName(shardingValue.getLogicTableName() , "_" + shardingValue.getValue());
       }
   
       @Override
       public Collection<String> doSharding(Collection<String> availableTargetNames,
                                            RangeShardingValue<String> shardingValue) {
   
           List<String> result = new ArrayList<>();
           Range<String> ranges = shardingValue.getValueRange();
           final String logicTableName = shardingValue.getLogicTableName();
           Date startTime;
           try {
               startTime = YYYYMMDD.parse(ranges.lowerEndpoint());
           } catch (ParseException e) {
               throw new RuntimeException("table" + logicTableName + " timeRange start parameter not yyyyMMdd format error:" + ranges.lowerEndpoint());
           }
           Date endTime;
           try {
               endTime = YYYYMMDD.parse(ranges.upperEndpoint());
           } catch (ParseException e) {
               throw new RuntimeException("table" + logicTableName + " timeRange end parameter not yyyyMMdd format error:" + ranges.lowerEndpoint());
           }
           // 此处应该返回 tablePrefix+201808 , tablePrefix+201809,tablePrefix+201810,
           Calendar cal = Calendar.getInstance();
   
           result = getTableNames(result, startTime, endTime, cal, logicTableName);
   
           return result;
       }
   }`

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services