Java中sharding-jdbc按年月分片的示例代碼
更新時(shí)間:2023年07月24日 11:52:14 作者:我的芒果
本文主要介紹了Java中sharding-jdbc按年月分片的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
Pom依賴
<!--shardingjdbc分片,和Druid不兼容,如果不使用sharding則需要注釋--> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.1.1</version> </dependency>
Yml配置
spring: autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure main: allow-bean-definition-overriding: true shardingsphere: #配置數(shù)據(jù)源 datasource: names: ds-master ds-master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://***:3306/aihosp?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true username: *** password: *** sharding: tables: table1: actual-data-nodes: ds-master.table1_$->{2021..2025} #按年分表 tableStrategy: standard: #用于單分片鍵的標(biāo)準(zhǔn)分片場(chǎng)景 sharding-column: create_time precise-algorithm-class-name: com.**.common.algorithm.PreciseRangeShardingAlgorithm # 精確分片算法類名稱,用于=和IN。該類需實(shí)現(xiàn)PreciseShardingAlgorithm接口并提供無參數(shù)的構(gòu)造器 range-algorithm-class-name: com.**.common.algorithm.PreciseRangeShardingAlgorithm #范圍分片算法類名稱,用于BETWEEN,可選。該類需實(shí)現(xiàn)RangeShardingAlgorithm接口并提供無參數(shù)的構(gòu)造器 key-generator: column: id type: SNOWFLAKE #分布式全局ID(雪花算法) retry-interval-milliseconds: 500 table2: actual-data-nodes: ds-master.table2_$->{2022..2025}0$->{1..9},ds-master.table2_$->{2022..2025}1$->{0..2} #按月分表 tableStrategy: standard: #用于單分片鍵的標(biāo)準(zhǔn)分片場(chǎng)景 sharding-column: create_date precise-algorithm-class-name: com.**.common.algorithm.PreciseRangeShardingAlgorithm range-algorithm-class-name: com.**.common.algorithm.PreciseRangeShardingAlgorithm key-generator: column: id type: SNOWFLAKE #分布式全局ID(雪花算法) retry-interval-milliseconds: 500 #其他運(yùn)行屬性 props: sql: show: false # 是否顯示日志
時(shí)間策略
/** * * 按年分片 * 精準(zhǔn)分庫PreciseShardingDBAlgorithm * * 范圍分庫RangeShardingDBAlgorithm * * 精準(zhǔn)分表PreciseShardingTableAlgorithm * * 范圍分表RangeShardingTableAlgorithm: */ @Slf4j public class PreciseRangeShardingAlgorithm implements PreciseShardingAlgorithm<String>,RangeShardingAlgorithm<String> { /** * RangeShardingAlgorithm的重寫 根據(jù)傳入的分片健的值,對(duì)所有待選擇的表中 根據(jù)自己的業(yè)務(wù)邏輯進(jìn)行判斷,選擇符合條件的表返回 * @param tableNameList 返回需要查詢的表 * @param shardingValue 傳入的分片健的值 * @return 返回符合條件的表名稱 */ @Override public Collection<String> doSharding(Collection<String> tableNameList, RangeShardingValue<String> shardingValue) { System.out.println("[MyTableRangeShardingAlgorithm] shardingValue: [{}]\n"+ shardingValue); Set<String> tableNameResultList = new LinkedHashSet<>(); Range<String> rangeValue = shardingValue.getValueRange(); String flag = "year"; for (String tableName : tableNameList) { if (tableName.startsWith("table2")) { flag = "month"; break; } } if ("year".equals(flag)) { int lowInt = Integer.parseInt(rangeValue.lowerEndpoint().substring(0,5).replaceAll("-","")); int upperInt = Integer.parseInt(rangeValue.upperEndpoint().substring(0,5).replaceAll("-","")); for (String tableNameItem : tableNameList) { String substring = tableNameItem.substring(tableNameItem.length() - 4); int tableItem = Integer.valueOf(substring); if(tableItem >= lowInt && tableItem <= upperInt ){ tableNameResultList.add(tableNameItem); } } } else if ("month".equals(flag)) { int lowInt = Integer.parseInt(rangeValue.lowerEndpoint().substring(0,7).replaceAll("-","")); int upperInt = Integer.parseInt(rangeValue.upperEndpoint().substring(0,7).replaceAll("-","")); for (String tableNameItem : tableNameList) { String substring = tableNameItem.substring(tableNameItem.length() - 6,tableNameItem.length()); int tableItem = Integer.valueOf(substring); if(tableItem >= lowInt && tableItem <= upperInt ){ tableNameResultList.add(tableNameItem); } } } return tableNameResultList; } /** PreciseShardingAlgorithm的重寫 */ @Override public String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) { String s = buildShardingTable(preciseShardingValue.getLogicTableName(), preciseShardingValue.getValue()); return s; } /** * 構(gòu)建分片后的表名 * @param logicTableName * @param date * @return */ private String buildShardingTable(String logicTableName, String date) { StringBuffer stringBuffer = new StringBuffer(logicTableName).append("_").append(date, 0, 4); if (logicTableName.startsWith("table2")) { // 月分表 stringBuffer = new StringBuffer(logicTableName).append("_").append(date, 0, 4) .append(date, 5, 7); } return stringBuffer.toString(); } }
到此這篇關(guān)于Java中sharding-jdbc按年月分片的示例代碼的文章就介紹到這了,更多相關(guān)Java sharding-jdbc按年月分片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Feign利用自定義注解實(shí)現(xiàn)路徑轉(zhuǎn)義詳解
這篇文章主要講解一下如何通過注解實(shí)現(xiàn)對(duì)路由中的路徑進(jìn)行自定義編碼,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下2022-06-06使用Idea maven創(chuàng)建Spring項(xiàng)目過程圖解
這篇文章主要介紹了使用Idea maven創(chuàng)建Spring項(xiàng)目過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02java使用hashMap緩存保存數(shù)據(jù)的方法
這篇文章主要介紹了java使用hashMap緩存保存數(shù)據(jù)的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了java基于hashmap讀寫緩存數(shù)據(jù)的相關(guān)操作技巧,需要的朋友可以參考下2016-08-08java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例
這篇文章主要介紹了java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法,涉及java針對(duì)字符的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10