ds0



ds1

兩個數據庫的主和從一共四個數據源。


parentDs

 

是數據源公共的配置,抽出去以免寫重復代碼。

<!-- ds0的主-->
<bean id="ds0_master" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs"> 
<property name="driverClassName" value=""/>
    <property name="url" value=""/>
</bean>
<!-- ds0的從-->
<bean id="ds0_slave" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs">
    <property name="driverClassName" value=""/>
    <property name="url" value="${sharding.connection.url.0}"/>
</bean>
<!-- ds1的主-->
<bean id="ds1_master" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs">
    <property name="driverClassName" value=""/>
    <property name="url" value="${sharding.connection.url.1}"/>
</bean>
<!-- ds1的從-->
<bean id="ds1_slave" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs">
    <property name="driverClassName" value=""/>
    <property name="url" value="${sharding.connection.url.1}"/>
</bean>

5.2 讀寫分離配置

只配置主從不配置分庫分表的情況如下,如果要配置分庫分表則不需要下面這個配置。


master-data-source-name

 

是主數據源ID


slave-data-source-names

 

是從數據源ID

<master-slave:data-source id="masterSlaveDataSource" master-data-source-name="ds0_master, ds1_master" slave-data-source-names="ds0_slave, ds1_slave " >
        <master-slave:props>
                <prop key="sql.show">${sql_show}</prop>
                <prop key="executor.size">10</prop>
                <prop key="foo">bar</prop>
        </master-slave:props>
</master-slave:data-source>

5.3 讀寫分離和分庫分表一起配置

如果讀寫分離和分庫分表一起使用的話把主從路由配置到 shardingdata-source下就可以了。


sharding:master-slave-rule

 

的 id 就是配置出來的邏輯的數據源的名稱,如果多個從的話還可以通過配置strategy-ref來配置負載均衡。


master-data-source

 

配置的是主庫數據源ID 。


slave-data-source

 

配置的是從庫數據源ID,多個以逗號分開。

<!-- sharding數據源-->
<sharding:data-source id="shardingDataSource">
    <!-- 讀寫分離的話要把所有的主從數據源都寫在這里-->
    <sharding:sharding-rule
            data-source-names="ds0_master,ds0_slave,ds1_master,ds1_slave ">
        <!-- 讀寫分離的路由 一主一從配置 strategy-ref  -->
        <sharding:master-slave-rules>
            <sharding:master-slave-rule id="ds0" master-data-source-name="ds0_master"                                        slave-data-source-names="ds0_slave"/>
            <sharding:master-slave-rule id="ds1" master-data-source-name="ds1_master"                                        slave-data-source-names="ds1_slave"/>
        </sharding:master-slave-rules>
        <!-- 讀寫分離配置 結束-->
        <sharding:table-rules>
    <!— 這里是分庫分表路由的配置 -->
        </sharding:table-rules>
        <sharding:binding-table-rules>
    <!—- 綁定表的配置 --> 
        </sharding:binding-table-rules>
 </sharding:sharding-rule>
<sharding:props>
        <!-- 顯示SQL -->
        <prop key="sql.show">true</prop>
    </sharding:props>
</sharding:data-source>

六、數據分片

6.1 分片支持

Sharding-JDBC提供了5種分片策略。由于分片算法和業務實現緊密相關,因此Sharding-JDBC并未提供內置分片算法,而是通過分片策略將各種場景提煉出來,提供更高層級的抽象,并提供接口讓應用開發者自行實現分片算法。

StandardShardingStrategy

標準分片策略。提供對SQL語句中的=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持單分片鍵,提供PreciseShardingAlgorithm和RangeShardingAlgorithm兩個分片算法。PreciseShardingAlgorithm是必選的,用于處理=和IN的分片;RangeShardingAlgorithm是可選的,用于處理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND將按照全庫路由處理。

ComplexShardingStrategy

復合分片策略。提供對SQL語句中的=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片鍵,由于多分片鍵之間的關系復雜,因此Sharding-JDBC并未做過多的封裝,而是直接將分片鍵值組合以及分片操作符交于算法接口,完全由應用開發者實現,提供最大的靈活度。

InlineShardingStrategy

Inline表達式分片策略。使用Groovy的Inline表達式,提供對SQL語句中的=和IN的分片操作支持。InlineShardingStrategy只支持單分片鍵,對于簡單的分片算法,可以通過簡單的配置使用,從而避免繁瑣的Java代碼開發,如: tuser${user_id % 8} 表示t_user表按照user_id按8取模分成8個表,表名稱為t_user_0到t_user_7。

HintShardingStrategy

通過Hint而非SQL解析的方式分片的策略。

NoneShardingStrategy

不分片的策略。

6.2 分片配置

標準分片配置

<!-- 標準分片策略。-->
<bean id="demoUserStandardStrategy" class="shard.strategy.DemoUserStandardStrategy"/>
<sharding:standard-strategy id="shardingDemoUserStandardStrategy"
                            precise-algorithm-ref="demoUserStandardStrategy" sharding-column="id"                            range-algorithm-ref=""/>

DemoUserStandardStrategy標準分片要實現 PreciseShardingAlgorithm 接口,doSharding的兩個參數一個是所有數據源的cllection.另一個參數是執行SQL時傳過來的分片的值。

/**
 * 根據ID取
 * 標準分片策略
 * 用于處理=和IN的分片
 * @author yulonggao
 * @date 2019/1/31 14:35
 */
@Slf4j
public class DemoUserStandardStrategy implements PreciseShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {
        //這個里邊有異常會被處理掉,然后導致拿不到分片。但出異常一般是業務代碼寫錯了。
        //每條指定分片的操作都會調用此方法,如果是in 條件查詢的話每個值會調用一次此方法,如果是批量插入也是每一條都要調用一次進行分片
        log.info("DemoUserStandardStrategy_preciseShardingValue={}", preciseShardingValue);
        Long suffix = preciseShardingValue.getValue() % 4;
        log.info("suffix={}", suffix);
        final String targetDb = String.valueOf(Math.abs(suffix.intValue()));
        String shardingValue = collection.stream().filter(p -> p.endsWith(targetDb)).findFirst().get();
        log.info("preciseShardingValue={},shardingValue={}", preciseShardingValue, shardingValue);
        return shardingValue;
    }

強制分片

<!-- 強制路由分片策略-->
<bean id="demoUserHintStrategy" class="shard.strategy.DemoUserHintStrategy"/>
<!-- 強制路由例子使用-->
<sharding:hint-strategy id="shardingDemoUserHintStrategy" algorithm-ref="demoUserHintStrategy"/>
DemoUserHintStrategy 的Java 如下,強制分片要實現HintShardingAlgorithm接口。
/**
 * DemoUserHint強制路由分片策略,其實可以共用,只是例子
 * @author yulonggao
 * @date 2019/1/31 14:35
 */
@Slf4j
public class DemoUserHintStrategy implements HintShardingAlgorithm {
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue) {
        //availableTargetNames 這個參數是所有的dataSource的集合,shardingValue是HintManager傳過來的分片信息
        log.info("DemoUserHintStrategy_availableTargetNames={}", availableTargetNames);
        log.info("DemoUserHintStrategy_shardingValue={}", shardingValue);
        ListShardingValue listShardingValue = (ListShardingValue) shardingValue;
        Collection shardingValueList = listShardingValue.getValues();
        //因為調用的時候分片是直接傳的 DataSource的名稱,所以直接返回就可以了,如果傳其它值則要加業務邏輯進行分片篩選
        //返回結果只能是availableTargetNames 里邊所包含的
        return shardingValueList;
    }
}

生成分部式ID的配置,生成主鍵的類要實現KeyGenerator接口。

<!—主鍵生成 -->
<bean id="keyId" class="shard.key.DefaultKeyGenerator"/>

七、分布式事務

把下面這行代碼配置在spring里,shardingTransaction.xml 是jar包里邊帶的。

文件的源碼只有兩行配置:

<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="shardingDataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 事務支持-->
<import resource="classpath:META-INF/shardingTransaction.xml"/>

使用注解配置事務要同時使用ShardingTransactionType和Transactional兩個注解。

/**
 * 注意:@ShardingTransactionType需要同Spring的@Transactional配套使用,事務才會生效。
 * @param param
 * @return
 */
@ShardingTransactionType(TransactionType.XA)
@Transactional(rollbackFor = Exception.class)
@Override
public int addParam(DemoParam param) {
log.info("addParam-param={}", param);
return demoParamDao.addParam(param);
}

7.1 支持程度

完全支持非跨庫事務,例如:僅分表或分庫但是路由的結果在單庫中。

完全支持因邏輯異常導致的跨庫事務。例如:同一事務中跨兩個庫更新,更新完畢后,拋出空指針,則兩個庫的內容都能回滾。

支持數據庫字段約束造成的回滾。

不支持因網絡、硬件異常導致的跨庫事務。例如:同一事務中跨兩個庫更新,更新完畢后、未提交之前,第一個庫死機,則只有第二個庫數據提交。

八、其他問題

關于order by 排序,如果排序的字段不在查詢結果中,生成的SQL也會被帶上,但結果不返回給你。

九、參考文檔

https://shardingsphere.apache.org/document/current/cn/manual/sharding-jdbc/usage/sharding/

作者:高玉瓏

來源:

宜信技術學院

更多關于云服務器域名注冊,虛擬主機的問題,請訪問三五互聯官網:m.shinetop.cn

贊(0)
聲明:本網站發布的內容(圖片、視頻和文字)以原創、轉載和分享網絡內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。郵箱:3140448839@qq.com。本站原創內容未經允許不得轉載,或轉載時需注明出處:三五互聯知識庫 » Sharding-JDBC 使用入門和基本配置

登錄

找回密碼

注冊

主站蜘蛛池模板: 国产亚洲精品黑人粗大精选| 精品亚洲国产成人| 无码一区二区三区AV免费| 77777亚洲午夜久久多人| 日韩av一区二区不卡在线| 色噜噜亚洲男人的天堂| 国产精品成| 亚洲国产精品成人av网| 国产成人高清亚洲综合| 国产精品国产三级国产专业| 亚洲精品777| 平陆县| 又大又粗欧美黑人aaaaa片| 石家庄市| 免费国产好深啊好涨好硬视频| 亚洲国产精品成人一区二区在线| 孕妇怀孕高潮潮喷视频孕妇 | 一亚洲一区二区中文字幕| 亚洲中文字幕无码一区无广告 | 三级国产三级在线| 欧美成人精品一级在线观看| 亚洲综合天堂av网站在线观看| 亚洲国产成人无码av在线播放 | 亚洲精品成人片在线观看精品字幕| 日韩在线视频一区二区三| 亚洲综合一区二区国产精品| 国产精品无码专区| 美女内射毛片在线看3d| 在线观看人成视频免费| 久久久久免费看成人影片| 精品国精品国产自在久国产应用男| 玩弄漂亮少妇高潮白浆| 少妇高潮喷水在线观看| 精品久久久久久无码不卡| 在线观看国产区亚洲一区| 亚洲精品毛片一区二区| 精品国产成人a在线观看| 日韩一区二区三区不卡片| 99精品国产一区二区三区| 377p欧洲日本亚洲大胆| 成人欧美一区在线视频|