国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Sharding-JDBC分庫分表-自動配置與分片規(guī)則加載原理-3

這篇具有很好參考價值的文章主要介紹了Sharding-JDBC分庫分表-自動配置與分片規(guī)則加載原理-3。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Sharding JDBC自動配置的原理

與所有starter一樣,shardingsphere-jdbc-core-spring-boot-starter也是通過SPI自動配置的原理實現(xiàn)分庫分表配置加載,spring.factories文件中的自動配置類shardingsphere-jdbc-core-spring-boot-starter功不可沒,他主要是自動創(chuàng)建了模式bean、事務(wù)類型bean和數(shù)據(jù)源bean,配置加載的過程可以歸納如下:

其中,創(chuàng)建數(shù)據(jù)源bean時會根據(jù)不同的模式創(chuàng)建不同的bean,本地模式直接從配置文件中加載,配置中心模式就從配置中心加載。ShardingSphereAutoConfiguration的實現(xiàn)如下:

@Configuration
@ComponentScan("org.apache.shardingsphere.spring.boot.converter")
@EnableConfigurationProperties(SpringBootPropertiesConfiguration.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@RequiredArgsConstructor
public class ShardingSphereAutoConfiguration implements EnvironmentAware {
    
    private String databaseName;
    
    private final SpringBootPropertiesConfiguration props;
    
    private final Map<String, DataSource> dataSourceMap = new LinkedHashMap<>();
    
    /**
     * 模式配置
     *
     * @return mode configuration
     */
    @Bean
    public ModeConfiguration modeConfiguration() {
        return null == props.getMode() ? null : new YamlModeConfigurationSwapper().swapToObject(props.getMode());
    }
    
    /**
     * 單機(jī)模式:從本地配置中加載DataSource
     *
     * @param rules rules configuration
     * @param modeConfig mode configuration
     * @return data source bean
     * @throws SQLException SQL exception
     */
    @Bean
    @Conditional(LocalRulesCondition.class)
    @Autowired(required = false)
    public DataSource shardingSphereDataSource(final ObjectProvider<List<RuleConfiguration>> rules, final ObjectProvider<ModeConfiguration> modeConfig) throws SQLException {
        Collection<RuleConfiguration> ruleConfigs = Optional.ofNullable(rules.getIfAvailable()).orElseGet(Collections::emptyList);
        return ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig.getIfAvailable(), dataSourceMap, ruleConfigs, props.getProps());
    }
    
    /**
     * 集群模式:從配置中心中加載DataSource
     *
     * @param modeConfig mode configuration
     * @return data source bean
     * @throws SQLException SQL exception
     */
    @Bean
    @ConditionalOnMissingBean(DataSource.class)
    public DataSource dataSource(final ModeConfiguration modeConfig) throws SQLException {
        return !dataSourceMap.isEmpty() ? ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig, dataSourceMap, Collections.emptyList(), props.getProps())
                : ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig);
    }
    
    /**
     * 事務(wù)類型掃描bean
     *
     * @return transaction type scanner
     */
    @Bean
    public TransactionTypeScanner transactionTypeScanner() {
        return new TransactionTypeScanner();
    }
    
    @Override
    public final void setEnvironment(final Environment environment) {
        dataSourceMap.putAll(DataSourceMapSetter.getDataSourceMap(environment));
        databaseName = DatabaseNameSetter.getDatabaseName(environment);
    }
}

下面以單機(jī)模式出發(fā)點,理一下加載的過程。

@Bean
@Conditional(LocalRulesCondition.class)
@Autowired(required = false)
public DataSource shardingSphereDataSource(final ObjectProvider<List<RuleConfiguration>> rules, final ObjectProvider<ModeConfiguration> modeConfig) throws SQLException {
    Collection<RuleConfiguration> ruleConfigs = Optional.ofNullable(rules.getIfAvailable()).orElseGet(Collections::emptyList);
    // 通過ShardingSphereDataSourceFactory工廠創(chuàng)建數(shù)據(jù)源
    return ShardingSphereDataSourceFactory.createDataSource(databaseName, modeConfig.getIfAvailable(), dataSourceMap, ruleConfigs, props.getProps());
}

通過對源碼的跟蹤,可以發(fā)現(xiàn),ShardingSphereDataSourceFactory.createDataSource創(chuàng)建數(shù)據(jù)源經(jīng)歷了如下的過程

分片規(guī)則加載原理

分片規(guī)則、審計規(guī)則、key生成規(guī)則都是通過SPI的方式加載,自動配置類ShardingSphereAutoConfiguration中創(chuàng)建ShardingSphereDataSource的時候,會加載配置的分片規(guī)則,創(chuàng)建核心配置類ShardingRule,在ShardingRule的創(chuàng)建中會通過SPI的方式加載分片規(guī)則。加載的過程如下:

SPI核心實現(xiàn)類ShardingSphereServiceLoader中會將SPI接口進(jìn)行Map緩存管理,需要時直接獲取。如果Map中不存在,就通過反射的方式新建服務(wù)實例,具體實現(xiàn)源碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-693990.html

public final class ShardingSphereServiceLoader {
    
    // 緩存service實例,
    // 緩存的Key,如:
    //  org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
    //  org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm
    //  org.apache.shardingsphere.transaction.spi.ShardingSphereTransactionManager
    private static final Map<Class<?>, Collection<Object>> SERVICES = new ConcurrentHashMap<>();
    
    /**
     * 注冊服務(wù)實例
     *
     * @param 服務(wù)接口
     */
    public static void register(final Class<?> serviceInterface) {
        if (!SERVICES.containsKey(serviceInterface)) {
            SERVICES.put(serviceInterface, load(serviceInterface));
        }
    }
    
    private static <T> Collection<Object> load(final Class<T> serviceInterface) {
        Collection<Object> result = new LinkedList<>();
        for (T each : ServiceLoader.load(serviceInterface)) {
            result.add(each);
        }
        return result;
    }
    
    /**
     * 獲取服務(wù)實例
     * 
     * @param 服務(wù)接口
     * @param <T> 服務(wù)類型
     * @return 服務(wù)實例
     */
    public static <T> Collection<T> getServiceInstances(final Class<T> serviceInterface) {
        return null == serviceInterface.getAnnotation(SingletonSPI.class) ? createNewServiceInstances(serviceInterface) : getSingletonServiceInstances(serviceInterface);
    }
    
    @SneakyThrows(ReflectiveOperationException.class)
    @SuppressWarnings("unchecked")
    private static <T> Collection<T> createNewServiceInstances(final Class<T> serviceInterface) {
        if (!SERVICES.containsKey(serviceInterface)) {
            return Collections.emptyList();
        }
        Collection<Object> services = SERVICES.get(serviceInterface);
        if (services.isEmpty()) {
            return Collections.emptyList();
        }
        Collection<T> result = new LinkedList<>();
        for (Object each : services) {
            // 通過反射新建實例
            result.add((T) each.getClass().getDeclaredConstructor().newInstance());
        }
        return result;
    }
    
    @SuppressWarnings("unchecked")
    private static <T> Collection<T> getSingletonServiceInstances(final Class<T> serviceInterface) {
        return (Collection<T>) SERVICES.getOrDefault(serviceInterface, Collections.emptyList());
    }
}

到了這里,關(guān)于Sharding-JDBC分庫分表-自動配置與分片規(guī)則加載原理-3的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 一、Sharding-JDBC系列01:整合SpringBoot實現(xiàn)分庫分表,讀寫分離

    一、Sharding-JDBC系列01:整合SpringBoot實現(xiàn)分庫分表,讀寫分離

    目錄 一、概述 二、案例演示-水平分表 (1)、創(chuàng)建springboot工程 (2)、創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表 (3)、application.yaml配置分片規(guī)則?? (4)、測試數(shù)據(jù)插入、查詢操作 4.1、插入-控制臺SQL日志? 4.2、查詢-控制臺SQL日志 ?三、案例演示-水平分庫 (1)、創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表? (2)、application.yaml配置

    2024年02月02日
    瀏覽(17)
  • Mybatis-Plus集成Sharding-JDBC與Flyway實現(xiàn)多租戶分庫分表

    Mybatis-Plus集成Sharding-JDBC與Flyway實現(xiàn)多租戶分庫分表

    公司產(chǎn)品部收到了一些重要客戶的需求,他們希望能夠依賴獨立的數(shù)據(jù)庫存儲來支持他們的業(yè)務(wù)數(shù)據(jù)。與此同時,仍有許多中小客戶,可以繼續(xù)使用公共庫以滿足其需求。技術(shù)實現(xiàn)方面,此前持久層框架使用的Mybatis-plus,部分業(yè)務(wù)場景使用到了Sharding-JDBC用于分表,另外,我們

    2024年02月05日
    瀏覽(24)
  • Sharding-JDBC分庫連接數(shù)優(yōu)化

    Sharding-JDBC分庫連接數(shù)優(yōu)化

    一、背景 配運(yùn)平臺組的快遞訂單履約中心(cp-eofc)及物流平臺履約中心(jdl-uep-ofc)系統(tǒng)都使用了ShardingSphere生態(tài)的sharding-jdbc作為分庫分表中間件, 整個集群采用只分庫不分表的設(shè)計,共16個MYSQL實例,每個實例有32個庫,集群共512個庫. 當(dāng)每增加一臺客戶端主機(jī),一個MYSQl實例最少要增加

    2024年02月14日
    瀏覽(19)
  • Sharding-JDBC之PreciseShardingAlgorithm(精確分片算法)

    Sharding-JDBC之PreciseShardingAlgorithm(精確分片算法)

    ??在我之前的文章里,數(shù)據(jù)的分庫分表都是基于行表達(dá)式的方式來實現(xiàn)的,看起來也蠻好用,也挺簡單的,但是有時會有些復(fù)雜的規(guī)則,可能使用行表達(dá)式策略會很復(fù)雜或者實現(xiàn)不了,我們就講另外一種分片策略,精確分片算法,通常用來處理=或者in條件的情況比較多。

    2024年02月11日
    瀏覽(18)
  • Sharding-JDBC(十)如何解決根據(jù)ID更新時掃描全部分表

    我們在使用 ShardingJDBC 作為分片工具的時候,會在配置中指定分片鍵,例如根據(jù) create_time 創(chuàng)建時間來按月分片是比較常用的操作。當(dāng)分片表中需要 根據(jù)主鍵 ID 來進(jìn)行更新的時候 ,由于不確定數(shù)據(jù)的 create_time 具體是多少,ShardingJDBC 就會在選擇使用分片表的時候,就會默認(rèn)選

    2024年02月07日
    瀏覽(23)
  • SpringBoot+Sharding-jdbc+mybatis-plus實現(xiàn)水平分表

    這塊我就不演示了

    2024年02月12日
    瀏覽(19)
  • Sharding JDBC 分庫分表(一致性Hash + 虛擬節(jié)點)

    Sharding JDBC 分庫分表(一致性Hash + 虛擬節(jié)點)

    一、背景 傳統(tǒng)的將數(shù)據(jù)集中存儲至單一數(shù)據(jù)節(jié)點的解決方案,在性能、可用性和運(yùn)維成本這三方面已經(jīng)難于滿足互聯(lián)網(wǎng)的海量數(shù)據(jù)場景。 從 性能 方面來說,由于關(guān)系型數(shù)據(jù)庫大多采用B+樹類型的索引,在數(shù)據(jù)量超過閾值的情況下,索引深度的增加也將使得磁盤訪問的IO次數(shù)

    2024年02月10日
    瀏覽(30)
  • Sharding-JDBC 自定義一致性哈希算法 + 虛擬節(jié)點 實現(xiàn)數(shù)據(jù)庫分片策略

    分片操作是分片鍵 + 分片算法,也就是分片策略。目前Sharding-JDBC 支持多種分片策略: 標(biāo)準(zhǔn)分片策略 對應(yīng)StandardShardingStrategy。提供對SQL語句中的=, IN和BETWEEN AND的分片操作支持。 復(fù)合分片策略 對應(yīng)ComplexShardingStrategy。復(fù)合分片策略。提供對SQL語句中的=, IN和BETWEEN AND的分片操作

    2024年02月02日
    瀏覽(97)
  • sharding-jdbc多數(shù)據(jù)源配置

    通過sharding-jdbc做分表這里就不多做介紹了,需要的可以看上一片文章 當(dāng)項目中配置了多數(shù)據(jù)源,并且其中一個數(shù)據(jù)源需要使用sharding-jdbc分表時,配置如下 導(dǎo)入shardingjdbc依賴 這里使用的是4.0.1的配置,和上篇的3.1.0差別不大,詳細(xì)配置大伙可以上官網(wǎng)查閱。 多數(shù)據(jù)源配置類

    2024年02月14日
    瀏覽(16)
  • Sharding-JDBC(六)5.1.0版本,實現(xiàn)按月分表、自動建表、自動刷新節(jié)點

    Sharding-JDBC(六)5.1.0版本,實現(xiàn)按月分表、自動建表、自動刷新節(jié)點

    官網(wǎng)地址: https://shardingsphere.apache.org/ GitHub: https://github.com/apache/shardingsphere 官方示例: https://github.com/apache/shardingsphere/tree/master/examples 中文社區(qū): https://community.sphere-ex.com/ 5.1.0 官方文檔: https://shardingsphere.apache.org/document/5.1.0/cn/overview/ 背景: 項目用戶數(shù)據(jù)庫表量太大,對

    2024年02月02日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包