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

sharding-jdbc5.0.0實現(xiàn)分表實踐

 更新時間:2022年02月11日 08:39:22   作者:IAyue  
本文主要介紹了sharding-jdbc5.0.0分表實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文基于shardingsphere-jdbc-core-spring-boot-starter 5.0.0,請注意不同版本的sharding-jdbc配置可能有不一樣的地方,本文不一定適用于其它版本

相關(guān)的maven配置如下:

? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-data-jpa</artifactId>
? ? ? ? </dependency>
? ? ? ?<dependency>
? ? ? ? ? ? <groupId>org.apache.shardingsphere</groupId>
? ? ? ? ? ? <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
? ? ? ? ? ? <version>5.0.0</version>
? ? ? ? </dependency>
? ? ? <dependency>
? ? ? ? ? ? <groupId>mysql</groupId>
? ? ? ? ? ? <artifactId>mysql-connector-java</artifactId>
? ? ? ? </dependency>

以下為單庫分表的配置,根據(jù)對象的trade_no字段hash后mod進行分片,把數(shù)據(jù)分散到12個表中

spring:
? shardingsphere:
? ? datasource: ?##數(shù)據(jù)源配置
? ? ? ds0:
? ? ? ? driver-class-name: com.mysql.jc.jdbc.Driver
? ? ? ? jdbc-url: jdbc:mysql://...
? ? ? ? password: ...
? ? ? ? type: com.zaxxer.hikari.HikariDataSource
? ? ? ? username: root
? ? ? names: ds0
? ? mode:
? ? ? type: Memory
? ? props:
? ? ? sql-show: false ##為true時會打印sharding-jdbc生成的邏輯sql跟實際執(zhí)行語句
? ? rules: ##分片規(guī)則配置
? ? ? sharding:
? ? ? ? binding-tables:
? ? ? ? - trade_info
? ? ? ? sharding-algorithms:
? ? ? ? ? trade-info-inline: ?#分片算法配置
? ? ? ? ? ? props:
? ? ? ? ? ? ? sharding-count: '12'
? ? ? ? ? ? type: HASH_MOD
? ? ? ? tables:
? ? ? ? ? trade_info:
? ? ? ? ? ? actual-data-nodes: ds0.trade_info_$->{0..11}
? ? ? ? ? ? table-strategy:
? ? ? ? ? ? ? standard:
? ? ? ? ? ? ? ? sharding-algorithm-name: trade-info-inline ?##使用的分片算法名
? ? ? ? ? ? ? ? sharding-column: trade_no ?##分片鍵

jpa提供了TABLE(使用一個特定的數(shù)據(jù)庫表格來保存主鍵,在使用時從該表取數(shù)據(jù)做為主鍵)、SEQUENCE(由底層數(shù)據(jù)庫的序列來生成主鍵,需要數(shù)據(jù)庫支持序列)、IDENTITY(由數(shù)據(jù)庫自動生成主鍵,主要在自增ID列使用 )三種生成主鍵值的策略。但對于分庫分表來講都不太適用,所以自定義了一個使用雪花算法來生成主鍵值

public class SnowFlakeIdGenerator implements IdentifierGenerator {

? ? @Override
? ? public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException {
? ? ? ? return SnowFlakeUtil.nextId();
? ? }

? ? @Override
? ? public boolean supportsJdbcBatchInserts() {
? ? ? ? return true;
? ? }
}

實體類id的配置

? ? @Id
? ? @GenericGenerator(name = "snowflake",strategy = "com.****.****.****.SnowFlakeIdGenerator")
? ? @GeneratedValue(generator = "snowflake")
? ? private Long id;

配置完后,試了下新增、刪除、查詢都沒有問題,但更新記錄的時候出錯了,報錯信息為ShardingSphereException: Can not update sharding key, logic table: [**], column: [**]。從報錯信息看來是因為我更新了原有記錄的分片鍵,奇怪的

? ? public void preValidate(ShardingRule shardingRule, SQLStatementContext<UpdateStatement> sqlStatementContext, List<Object> parameters, ShardingSphereSchema schema) {
? ? ? ? this.validateMultipleTable(shardingRule, sqlStatementContext);
? ? ? ? UpdateStatement sqlStatement = (UpdateStatement)sqlStatementContext.getSqlStatement();
? ? ? ? String tableName = (String)sqlStatementContext.getTablesContext().getTableNames().iterator().next();
? ? ? ? Iterator var7 = sqlStatement.getSetAssignment().getAssignments().iterator();

? ? ? ? String shardingColumn;
? ? ? ? Optional shardingColumnSetAssignmentValue;
? ? ? ? Optional shardingValue;
? ? ? ? do {
? ? ? ? ? ? AssignmentSegment each;
? ? ? ? ? ? do {
? ? ? ? ? ? ? ? if (!var7.hasNext()) {
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? each = (AssignmentSegment)var7.next();
? ? ? ? ? ? ? ? shardingColumn = ((ColumnSegment)each.getColumns().get(0)).getIdentifier().getValue();
? ? ? ? ? ? } while(!shardingRule.isShardingColumn(shardingColumn, tableName));

? ? ? ? ? ? shardingColumnSetAssignmentValue = this.getShardingColumnSetAssignmentValue(each, parameters);
? ? ? ? ? ? shardingValue = Optional.empty();
? ? ? ? ? ? Optional<WhereSegment> whereSegmentOptional = sqlStatement.getWhere();
? ? ? ? ? ? if (whereSegmentOptional.isPresent()) {
? ? ? ? ? ? ? ? shardingValue = this.getShardingValue((WhereSegment)whereSegmentOptional.get(), parameters, shardingColumn);
? ? ? ? ? ? }
? ? ? ? } while(shardingColumnSetAssignmentValue.isPresent() && shardingValue.isPresent() && shardingColumnSetAssignmentValue.get().equals(shardingValue.get()));

? ? ? ? throw new ShardingSphereException("Can not update sharding key, logic table: [%s], column: [%s].", new Object[]{tableName, shardingColumn});
? ? }

是我并沒有更新分片鍵,調(diào)用棧中最開始出錯的代碼如下:

這方法在做的事情就是,如果update語句的set里面存在分片鍵,將會從where中獲取的分片鍵的值,然后將where語句中獲取到分片鍵值跟set語句中的分片鍵值比較是否發(fā)生改變,發(fā)生改變就會拋出ShardingSphereException。比如我的trade_info表分片鍵為trade_no,執(zhí)行的更新語句為update trade_info t set t.trade_no = 123,t.a = 1 where t.trade_no = 123,這段代碼就會去比較set中trade_no與where中trade_no的值是否一樣,不一樣或者where中沒有分片鍵而set中包含分片鍵就會拋異常。

打印了一下執(zhí)行的update語句,我提交的更新語句為update t set t.b = ? where t.a = ?,被sharding-jdbc攔下來檢查時語句變成了update t set t.a = ? ,t.b = ?,t.c = ? where t.id = ? ,語句發(fā)生了兩個變化:我原本語句只是更新了對象的部分屬性,執(zhí)行語句變成了全量更新;where子句被改變了,原本更新的條件是t.a=?,提交執(zhí)行時變成了t.id=?。原因是JPA對語句做了優(yōu)化,修改了我寫的語句,實體類中加上注解@DynamicUpdate,更新時只更新發(fā)生改變的字段,解決了問題。

更多的功能配置可以參考官方文檔:https://shardingsphere.apache.org/document/5.0.0/cn/user-manual/shardingsphere-jdbc/

到此這篇關(guān)于sharding-jdbc5.0.0實現(xiàn)分表實踐的文章就介紹到這了,更多相關(guān)sharding-jdbc5.0.0分表 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Maven在Windows中的配置以及IDE中的項目創(chuàng)建實例

    Maven在Windows中的配置以及IDE中的項目創(chuàng)建實例

    下面小編就為大家?guī)硪黄狹aven在Windows中的配置以及IDE中的項目創(chuàng)建實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • JAVA之String中刪除指定字符方式(11種方法)

    JAVA之String中刪除指定字符方式(11種方法)

    這篇文章主要介紹了JAVA之String中刪除指定字符方式(11種方法),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Spring Data JPA 如何使用QueryDsl查詢并分頁

    Spring Data JPA 如何使用QueryDsl查詢并分頁

    這篇文章主要介紹了Spring Data JPA 如何使用QueryDsl查詢并分頁,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java多線程yield心得分享

    Java多線程yield心得分享

    前幾天復(fù)習(xí)了一下多線程,發(fā)現(xiàn)有許多網(wǎng)上講的都很抽象,所以,自己把網(wǎng)上的一些案例總結(jié)了一下
    2013-12-12
  • java實現(xiàn)圖片上加文字水印(SpringMVC + Jsp)

    java實現(xiàn)圖片上加文字水印(SpringMVC + Jsp)

    這篇文章主要為大家詳細介紹了java實現(xiàn)在圖片上加文字水印的方法,水印可以是圖片或者文字,操作方便,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java實現(xiàn)HTML轉(zhuǎn)Word的完整指南

    Java實現(xiàn)HTML轉(zhuǎn)Word的完整指南

    在Java應(yīng)用程序中處理文檔轉(zhuǎn)換時,經(jīng)常需要將HTML內(nèi)容精準導(dǎo)出為格式規(guī)范的Word文檔,通過Spire.Doc for Java庫,開發(fā)者可以輕松實現(xiàn)HTML到Word的高保真轉(zhuǎn)換,所以本文給大家介紹了Java實現(xiàn)HTML轉(zhuǎn)Word的完整指南,需要的朋友可以參考下
    2025-09-09
  • httpclient staleConnectionCheckEnabled獲取連接流程解析

    httpclient staleConnectionCheckEnabled獲取連接流程解析

    這篇文章主要為大家介紹了httpclient staleConnectionCheckEnabled獲取連接流程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Mybatis 逆向工程的三種方法詳解

    Mybatis 逆向工程的三種方法詳解

    這篇文章主要介紹了Mybatis 逆向工程的三種方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • spring-boot通過@Scheduled配置定時任務(wù)及定時任務(wù)@Scheduled注解的方法

    spring-boot通過@Scheduled配置定時任務(wù)及定時任務(wù)@Scheduled注解的方法

    這篇文章主要介紹了spring-boot通過@Scheduled配置定時任務(wù),文中還給大家介紹了springboot 定時任務(wù)@Scheduled注解的方法,需要的朋友可以參考下
    2017-11-11
  • Java仿Windows記事本源代碼分享

    Java仿Windows記事本源代碼分享

    這篇文章主要為大家詳細介紹了Java仿Windows記事本源代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評論

梨树县| 方山县| 苍溪县| 吉安市| 茶陵县| 铅山县| 报价| 阿瓦提县| 梧州市| 木里| 武定县| 延寿县| 奉化市| 信阳市| 藁城市| 抚顺县| 阳春市| 景东| 东丽区| 积石山| 德州市| 翼城县| 定襄县| 金阳县| 和静县| 淮阳县| 思茅市| 福海县| 定安县| 昌宁县| 甘肃省| 霍邱县| 夹江县| 黄梅县| 屯门区| 郎溪县| 前郭尔| 萨迦县| 阳城县| 清流县| 红安县|