其他的都類似,只不過參數不太一樣,重寫之后想怎么玩就怎么玩
首先創建簡單maven項目,這里不做說明,自己搞
物理庫自行創建,必須有分片列,其他隨意。
導入依賴
<!-- sharding-jdbc依賴 --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>4.0.0-RC1</version> </dependency>
1.preciseAlgorithmClassName 精確(針對 sql中的 = 或者 in 方式)分片屬性自定義分片規則
創建自定義的方法,需要實現 ShardingAlgorithm接口或者這個接口的子類,並重寫里面的方法(就一個),下面是我的類中的全部代碼,根據需要自己改
package com.standard; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue; import java.util.Collection; import java.util.HashMap; import java.util.Map; import static java.lang.System.out; /** * @author :zhangyantao * @date : 2020/6/9 18:20 * standard 分片算法自定義實現 * 精確分片算法 **/ public class LocalPreciseShardingAlgorithm implements PreciseShardingAlgorithm<String> { /** * 數據庫前綴 */ private static final String PREFIX = "ds_"; /** * 自定義庫名配置 */ private static Map<String, String> map = new HashMap<String, String>(); static { map.put("420216", "370201"); } /** * availableTargetNames 被查到的庫列表 * preciseShardingValue 分片列的值 */ @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> preciseShardingValue) { out.println("============================single sharding============================="); if (preciseShardingValue != null) { String value = preciseShardingValue.getValue(); for (String name : availableTargetNames) { if (null != map.get(value) && map.get(value).trim().length() > 0) { //特定分片值處理 value = map.get(value); } String newName = PREFIX + Integer.parseInt(value) / 10000; if (newName.equals(name)) { return name; } } throw new UnsupportedOperationException("沒有匹配到可用庫"); } else { throw new UnsupportedOperationException("分片列為空"); } } }
寫完之后把整個項目打成jar包,然后把jar包導入到sharding proxy解壓目錄下的 lib ,然后在分庫或分表的分片算法位置使用
databaseStrategy:
standard:
shardingColumn: STR_AREA_CODE
preciseAlgorithmClassName: com.standard.CustomShardingTest
在preciseAlgorithmClassName處調用jar包內的類路徑,jar包放在lib下面,啟動時自動加載。
2.rangeAlgorithmClassName 范圍分片自定義
實現ShardingAlgorithm接口或者其子類,這里做簡單規則
package com.standard; import com.google.common.collect.Range; import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue; import java.util.ArrayList; import java.util.Collection; import java.util.List; import static java.lang.System.out; /** * @author :zhangyantao * @apiNote :standard 范圍分片算法 * @date : 2020/6/10 14:43 **/ public class LocalRangeShardingAlgorithm implements RangeShardingAlgorithm<String> { /** * 數據庫前綴 */ private static final String PREFIX = "ds_"; private static List<String> localList = new ArrayList<String>(); static { localList.add("379999"); localList.add("459999"); } @Override public Collection<String> doSharding(Collection<String> targetNames, RangeShardingValue<String> rangeShardingValue) { out.println("============================range sharding============================="); if (rangeShardingValue != null) { List<String> list = new ArrayList<String>(); Range<String> valueRange = rangeShardingValue.getValueRange(); for (String name : targetNames) { for (String l : localList) { if (valueRange.contains(l)) { String newName = PREFIX + Integer.parseInt(l) / 10000; if (name.equals(newName)) { list.add(name); } } } } if (list.size() > 0) { return list; } throw new UnsupportedOperationException("沒有匹配到可用庫"); } else { throw new UnsupportedOperationException("分片列為空"); } } }
可以和其他的自定義規則放到一起,互不影響
使用:
databaseStrategy:
standard:
shardingColumn: STR_AREA_CODE
rangeAlgorithmClassName: com.standard.LocalRangeShardingAlgorithm
3.兩者一起使用也可以
databaseStrategy:
standard:
shardingColumn: STR_AREA_CODE
preciseAlgorithmClassName: com.standard.LocalPreciseShardingAlgorithm
rangeAlgorithmClassName: com.standard.LocalRangeShardingAlgorithm