最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 分庫分表策略示例展示

 更新時間:2024年08月22日 09:37:26   作者:憤怒的代碼  
分庫分表是為了應對大規(guī)模數(shù)據(jù)和高并發(fā)請求,提高系統(tǒng)的性能和可擴展性,以下是如何在 Spring Boot 中實現(xiàn)分庫分表的詳細策略,感興趣的朋友一起看看吧

分庫分表是為了應對大規(guī)模數(shù)據(jù)和高并發(fā)請求,提高系統(tǒng)的性能和可擴展性。以下是如何在 Spring Boot 中實現(xiàn)分庫分表的詳細策略:

1. 分庫策略

分庫策略是將數(shù)據(jù)分散到多個數(shù)據(jù)庫實例中。常見的分庫策略有:

  • 按用戶 ID:例如,通過用戶 ID 的哈希值決定存儲到哪個數(shù)據(jù)庫。
  • 按業(yè)務類型:不同的業(yè)務或數(shù)據(jù)類型存儲到不同的數(shù)據(jù)庫。
  • 按數(shù)據(jù)量:根據(jù)數(shù)據(jù)量將數(shù)據(jù)分散到多個數(shù)據(jù)庫中。

實現(xiàn)步驟:

  • 配置多個數(shù)據(jù)源

application.yml 文件中配置多個數(shù)據(jù)源的連接信息。

示例配置:

spring:
  datasource:
    dynamic:
      primary: db1
      datasource:
        db1:
          url: jdbc:mysql://localhost:3306/db1
          username: root
          password: password
        db2:
          url: jdbc:mysql://localhost:3306/db2
          username: root
          password: password
        # 添加更多數(shù)據(jù)源
  • 動態(tài)數(shù)據(jù)源路由

創(chuàng)建 DynamicDataSource 類,繼承 AbstractRoutingDataSource,在 determineCurrentLookupKey 方法中返回當前的數(shù)據(jù)源標識。

DataSourceContextHolder 類用于存儲當前的數(shù)據(jù)庫標識。

public class DynamicDataSource extends AbstractRoutingDataSource {
     @Override
     protected Object determineCurrentLookupKey() {
         return DataSourceContextHolder.getDataSourceType();
     }
 }
?
 public class DataSourceContextHolder {
     private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
?
     public static void setDataSourceType(String dataSourceType) {
         contextHolder.set(dataSourceType);
     }
?
     public static String getDataSourceType() {
         return contextHolder.get();
     }
?
     public static void clearDataSourceType() {
         contextHolder.remove();
     }
 }
  • 根據(jù)用戶 ID 選擇數(shù)據(jù)源

使用工具類 DataSourceUtil 根據(jù)用戶 ID 計算出數(shù)據(jù)源標識。

public class DataSourceUtil {
     private static final int TOTAL_DATASOURCES = 8;
?
     public static String getDataSourceNameByUserId(Long userId) {
         int index = (int) (userId % TOTAL_DATASOURCES) + 1;
         return "db" + index;
     }
 }
  • 配置數(shù)據(jù)源

在配置類中創(chuàng)建 DynamicDataSource 實例,并配置各個數(shù)據(jù)源。

@Configuration
 public class DataSourceConfig {
     @Autowired
     @Qualifier("db1DataSource")
     private DataSource db1DataSource;
?
     @Autowired
     @Qualifier("db2DataSource")
     private DataSource db2DataSource;
?
     // 更多數(shù)據(jù)源...
?
     @Bean
     public DataSource dataSource() {
         DynamicDataSource dynamicDataSource = new DynamicDataSource();
         Map<Object, Object> targetDataSources = new HashMap<>();
         targetDataSources.put("db1", db1DataSource);
         targetDataSources.put("db2", db2DataSource);
         // 更多數(shù)據(jù)源...
?
         dynamicDataSource.setTargetDataSources(targetDataSources);
         dynamicDataSource.setDefaultTargetDataSource(db1DataSource);
         return dynamicDataSource;
     }
?
     @Bean
     public PlatformTransactionManager transactionManager() {
         return new DataSourceTransactionManager(dataSource());
     }
 }

2. 分表策略

分表策略是將數(shù)據(jù)分散到多個表中。常見的分表策略有:

  • 按時間分表:例如,每個月一個表。
  • 按 ID 范圍分表:例如,每 10000 條數(shù)據(jù)一個表。
  • 按用戶 ID 哈希:例如,將用戶數(shù)據(jù)分散到多個表中。

實現(xiàn)步驟:

  • 生成表名

創(chuàng)建工具類 TableNameUtil 根據(jù)分表策略生成表名。

public class TableNameUtil {
     public static String getTableNameByMonth(String baseTableName, LocalDate date) {
         String month = date.format(DateTimeFormatter.ofPattern("yyyy_MM"));
         return baseTableName + "_" + month;
     }
?
     public static String getTableNameByIdRange(String baseTableName, Long id) {
         int range = (int) (id / 10000);
         return baseTableName + "_" + range;
     }
?
     public static String getTableNameByUserId(String baseTableName, Long userId) {
         int tableIndex = (int) (userId % 8);
         return baseTableName + "_" + tableIndex;
     }
 }
  • 在數(shù)據(jù)訪問層使用分表策略

在數(shù)據(jù)訪問層根據(jù)生成的表名執(zhí)行數(shù)據(jù)庫操作。

@Repository
 public class OrderRepository {
     private final JdbcTemplate jdbcTemplate;
?
     public OrderRepository(JdbcTemplate jdbcTemplate) {
         this.jdbcTemplate = jdbcTemplate;
     }
?
     public void saveOrder(Order order) {
         String dataSourceName = DataSourceUtil.getDataSourceNameByUserId(order.getUserId());
         DataSourceContextHolder.setDataSourceType(dataSourceName);
?
         String tableName = TableNameUtil.getTableNameByUserId("orders", order.getUserId());
         String sql = "INSERT INTO " + tableName + " (id, order_date, amount) VALUES (?, ?, ?)";
         jdbcTemplate.update(sql, order.getId(), order.getOrderDate(), order.getAmount());
?
         DataSourceContextHolder.clearDataSourceType();
     }
 }

總結

  • 分庫:將數(shù)據(jù)存儲到多個數(shù)據(jù)庫中,通過動態(tài)數(shù)據(jù)源選擇和路由來決定當前使用的數(shù)據(jù)庫。
  • 分表:將數(shù)據(jù)存儲到多個表中,根據(jù)分表策略生成動態(tài)表名。
  • 實現(xiàn):配置多個數(shù)據(jù)源,使用動態(tài)數(shù)據(jù)源路由,創(chuàng)建工具類生成表名,并在數(shù)據(jù)訪問層應用這些策略。

這種分庫分表策略可以有效地提高系統(tǒng)的性能和可擴展性,尤其適用于大規(guī)模數(shù)據(jù)處理場景。

到此這篇關于Spring Boot 分庫分表策略示例展示的文章就介紹到這了,更多相關Spring Boot 分庫分表策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 帶你3分鐘帶你搞定Spring Boot中Schedule

    帶你3分鐘帶你搞定Spring Boot中Schedule

    本文主要圍繞Spring scheduled應用實踐進行分享,如果是單體應用,使用SpringBoot內(nèi)置的@scheduled注解可以解決大部分業(yè)務需求,對Spring Boot中Schedule 相關知識感興趣的朋友一起看看吧
    2024-07-07
  • Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java并發(fā)編程專題(四)----淺談(JUC)Lock鎖

    java并發(fā)編程專題(四)----淺談(JUC)Lock鎖

    這篇文章主要介紹了java并發(fā)編程(JUC)Lock鎖的相關內(nèi)容,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • MybatisPlus中的多表條件排序查詢

    MybatisPlus中的多表條件排序查詢

    這篇文章主要介紹了MybatisPlus中的多表條件排序查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Spring cloud config集成過程詳解

    Spring cloud config集成過程詳解

    這篇文章主要介紹了spring cloud config集成過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java如何獲取當前進程ID以及所有Java進程的進程ID

    Java如何獲取當前進程ID以及所有Java進程的進程ID

    本篇文章主要介紹了Java如何獲取當前進程ID以及所有Java進程的進程ID,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷)

    解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷)

    這篇文章主要介紹了解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 使用Java實現(xiàn)驗證碼程序

    使用Java實現(xiàn)驗證碼程序

    這篇文章主要為大家詳細介紹了使用Java實現(xiàn)驗證碼程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解使用JRebel插件實現(xiàn)SpringBoot應用代碼熱加載

    詳解使用JRebel插件實現(xiàn)SpringBoot應用代碼熱加載

    這篇文章主要介紹了詳解使用JRebel插件實現(xiàn)SpringBoot應用代碼熱加載,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Java?ynchronized重量級鎖的核心原理詳解

    Java?ynchronized重量級鎖的核心原理詳解

    這篇文章主要為大家詳細介紹了Java?ynchronized重量級鎖的核心原理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論

娄底市| 延长县| 苗栗县| 哈尔滨市| 邹平县| 宜都市| 于都县| 明星| 绥滨县| 肥城市| 平定县| 馆陶县| 大同市| 兴安县| 霍山县| 介休市| 新兴县| 奉新县| 榕江县| 吉安市| 普定县| 天长市| 丹棱县| 卫辉市| 西青区| 靖西县| 调兵山市| 西平县| 浮梁县| 乐昌市| 兴和县| 绵竹市| 佛教| 新泰市| 涟源市| 云阳县| 宣化县| 沅陵县| 深水埗区| 云和县| 全州县|