国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > Java > 正文

spring boot使用sharding jdbc的配置方式

2024-07-13 10:15:36
字體:
供稿:網(wǎng)友

本文介紹了spring boot使用sharding jdbc的配置方式,分享給大家,具體如下:

說明

要排除DataSourceAutoConfiguration,否則多數(shù)據(jù)源無法配置

@SpringBootApplication@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})public class Application {  public static void main(String[] args) {   SpringApplication.run(Application.class, args);  } }

配置的多個(gè)數(shù)據(jù)源交給sharding-jdbc管理,sharding-jdbc創(chuàng)建一個(gè)DataSource數(shù)據(jù)源提供給mybatis使用

官方文檔:http://shardingjdbc.io/index_zh.html

步驟

配置多個(gè)數(shù)據(jù)源,數(shù)據(jù)源的名稱最好要有一定的規(guī)則,方便配置分庫(kù)的計(jì)算規(guī)則

@Bean(initMethod="init", destroyMethod="close", name="dataSource0")@ConfigurationProperties(prefix = "spring.datasource")public DataSource dataSource0(){  return new DruidDataSource();}@Bean(initMethod="init", destroyMethod="close", name="dataSource1")@ConfigurationProperties(prefix = "spring.datasource2")public DataSource dataSource1(){  return new DruidDataSource();}

配置數(shù)據(jù)源規(guī)則,即將多個(gè)數(shù)據(jù)源交給sharding-jdbc管理,并且可以設(shè)置默認(rèn)的數(shù)據(jù)源,當(dāng)表沒有配置分庫(kù)規(guī)則時(shí)會(huì)使用默認(rèn)的數(shù)據(jù)源

@Beanpublic DataSourceRule dataSourceRule(@Qualifier("dataSource0") DataSource dataSource0,     @Qualifier("dataSource1") DataSource dataSource1){  Map<String, DataSource> dataSourceMap = new HashMap<>();  dataSourceMap.put("dataSource0", dataSource0);  dataSourceMap.put("dataSource1", dataSource1);  return new DataSourceRule(dataSourceMap, "dataSource0");}

配置數(shù)據(jù)源策略和表策略,具體策略需要自己實(shí)現(xiàn)

@Beanpublic ShardingRule shardingRule(DataSourceRule dataSourceRule){  //表策略  TableRule orderTableRule = TableRule.builder("t_order")      .actualTables(Arrays.asList("t_order_0", "t_order_1"))      .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()))      .dataSourceRule(dataSourceRule)      .build();  TableRule orderItemTableRule = TableRule.builder("t_order_item")      .actualTables(Arrays.asList("t_order_item_0", "t_order_item_1"))      .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()))      .dataSourceRule(dataSourceRule)      .build();  //綁定表策略,在查詢時(shí)會(huì)使用主表策略計(jì)算路由的數(shù)據(jù)源,因此需要約定綁定表策略的表的規(guī)則需要一致,可以一定程度提高效率  List<BindingTableRule> bindingTableRules = new ArrayList<BindingTableRule>();  bindingTableRules.add(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule)));  return ShardingRule.builder()      .dataSourceRule(dataSourceRule)      .tableRules(Arrays.asList(orderTableRule, orderItemTableRule))      .bindingTableRules(bindingTableRules)      .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new ModuloDatabaseShardingAlgorithm()))      .tableShardingStrategy(new TableShardingStrategy("order_id", new ModuloTableShardingAlgorithm()))      .build();}

創(chuàng)建sharding-jdbc的數(shù)據(jù)源DataSource,MybatisAutoConfiguration會(huì)使用此數(shù)據(jù)源

@Bean("dataSource")public DataSource shardingDataSource(ShardingRule shardingRule){  return ShardingDataSourceFactory.createDataSource(shardingRule);}

需要手動(dòng)配置事務(wù)管理器(原因未知)

//需要手動(dòng)聲明配置事務(wù)@Beanpublic DataSourceTransactionManager transactitonManager(@Qualifier("dataSource") DataSource dataSource){  return new DataSourceTransactionManager(dataSource);}

分庫(kù)策略的簡(jiǎn)單實(shí)現(xiàn),接口:DatabaseShardingAlgorithm

import java.util.Collection;import java.util.LinkedHashSet;import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlgorithm;import com.google.common.collect.Range;/** * Created by fuwei.deng on 2017年5月11日. */public class ModuloDatabaseShardingAlgorithm implements SingleKeyDatabaseShardingAlgorithm<Long> {  @Override  public String doEqualSharding(Collection<String> databaseNames, ShardingValue<Long> shardingValue) {   for (String each : databaseNames) {      if (each.endsWith(shardingValue.getValue() % 2 + "")) {        return each;      }    }    throw new IllegalArgumentException();  }    @Override  public Collection<String> doInSharding(Collection<String> databaseNames, ShardingValue<Long> shardingValue) {   Collection<String> result = new LinkedHashSet<>(databaseNames.size());    for (Long value : shardingValue.getValues()) {      for (String tableName : databaseNames) {        if (tableName.endsWith(value % 2 + "")) {          result.add(tableName);        }      }    }    return result;  }    @Override  public Collection<String> doBetweenSharding(Collection<String> databaseNames, ShardingValue<Long> shardingValue) {   Collection<String> result = new LinkedHashSet<>(databaseNames.size());    Range<Long> range = (Range<Long>) shardingValue.getValueRange();    for (Long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {      for (String each : databaseNames) {        if (each.endsWith(i % 2 + "")) {          result.add(each);        }      }    }    return result;  }}

分表策略的基本實(shí)現(xiàn),接口:TableShardingAlgorithm

import java.util.Collection;import java.util.LinkedHashSet;import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;import com.google.common.collect.Range;/** * Created by fuwei.deng on 2017年5月11日. */public class ModuloTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Long> {  @Override  public String doEqualSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) {   for (String each : tableNames) {      if (each.endsWith(shardingValue.getValue() % 2 + "")) {        return each;      }    }    throw new IllegalArgumentException();  }    @Override  public Collection<String> doInSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) {   Collection<String> result = new LinkedHashSet<>(tableNames.size());    for (Long value : shardingValue.getValues()) {      for (String tableName : tableNames) {        if (tableName.endsWith(value % 2 + "")) {          result.add(tableName);        }      }    }    return result;  }    @Override  public Collection<String> doBetweenSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) {   Collection<String> result = new LinkedHashSet<>(tableNames.size());    Range<Long> range = (Range<Long>) shardingValue.getValueRange();    for (Long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {      for (String each : tableNames) {        if (each.endsWith(i % 2 + "")) {          result.add(each);        }      }    }    return result;  }}

至此,分庫(kù)分表的功能已經(jīng)實(shí)現(xiàn)

讀寫分離

讀寫分離需在創(chuàng)建DataSourceRule之前加一層主從數(shù)據(jù)源的創(chuàng)建

// 構(gòu)建讀寫分離數(shù)據(jù)源, 讀寫分離數(shù)據(jù)源實(shí)現(xiàn)了DataSource接口, 可直接當(dāng)做數(shù)據(jù)源處理. // masterDataSource0, slaveDataSource00, slaveDataSource01等為使用DBCP等連接池配置的真實(shí)數(shù)據(jù)源DataSource masterSlaveDs0 = MasterSlaveDataSourceFactory.createDataSource("ms_0",           masterDataSource0, slaveDataSource00, slaveDataSource01);DataSource masterSlaveDs1 = MasterSlaveDataSourceFactory.createDataSource("ms_1",           masterDataSource1, slaveDataSource11, slaveDataSource11);// 構(gòu)建分庫(kù)分表數(shù)據(jù)源Map<String, DataSource> dataSourceMap = new HashMap<>(2);dataSourceMap.put("ms_0", masterSlaveDs0);dataSourceMap.put("ms_1", masterSlaveDs1);// 通過ShardingDataSourceFactory繼續(xù)創(chuàng)建ShardingDataSource

強(qiáng)制使用主庫(kù)時(shí)

HintManager hintManager = HintManager.getInstance();hintManager.setMasterRouteOnly();// 繼續(xù)JDBC操作

強(qiáng)制路由

  1. 使用ThreadLocal機(jī)制實(shí)現(xiàn),在執(zhí)行數(shù)據(jù)庫(kù)操作之前通過HintManager改變用于計(jì)算路由的值
  2. 設(shè)置HintManager的時(shí)候分庫(kù)和分表的策略必須同時(shí)設(shè)置,并且設(shè)置后需要路由的表都需要設(shè)置用于計(jì)算路由的值。比如強(qiáng)制路由后需要操作t_order和t_order_item兩個(gè)表,那么兩個(gè)表的分庫(kù)和分表的策略都需要設(shè)置
HintManager hintManager = HintManager.getInstance();hintManager.addDatabaseShardingValue("t_order", "user_id", 1L);hintManager.addTableShardingValue("t_order", "order_id", order.getOrderId());hintManager.addDatabaseShardingValue("t_order_item", "user_id", 1L);hintManager.addTableShardingValue("t_order_item", "order_id", order.getOrderId());

事務(wù)

  1. sharding-jdbc-transaction實(shí)現(xiàn)柔性事務(wù)(默認(rèn)提供了基于內(nèi)存的事務(wù)日志存儲(chǔ)器和內(nèi)嵌異步作業(yè)),可結(jié)合elastic-job(sharding-jdbc-transaction-async-job)實(shí)現(xiàn)異步柔性事務(wù)
  2. 沒有與spring結(jié)合使用的方式,需要自己封裝

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙口市| 东源县| 济南市| 济阳县| 环江| 镇沅| 兴国县| 二连浩特市| 汝阳县| 海门市| 格尔木市| 宁远县| 台安县| 肇庆市| 于田县| 伊宁市| 屏东市| 邢台市| 信宜市| 清镇市| 那曲县| 顺义区| 宜黄县| 博客| 高平市| 明星| 白玉县| 扬州市| 卓尼县| 濮阳市| 莎车县| 凌海市| 定南县| 华坪县| 高清| 抚松县| 合水县| 高雄市| 平南县| 恩施市| 淮阳县|