主頁 > 軟體設計 > 分庫分表之第二篇

分庫分表之第二篇

2020-09-14 01:45:21 軟體設計

分庫分表之第二篇

    • 2. Sharding-JDBC快速入門
      • 2.1需求說明
      • 2.2. 環境建設
        • 2.2.1環境說明
        • 2.2.2創建資料庫
        • 2.2.3約會maven依賴
      • 2.3 撰寫程式
        • 2.3.1 分片規則配置
        • 2.3.2 資料操作
        • 2.3.3 測驗
      • 2.4. 流程分析
      • 2.5 其他集成方式

 

2. Sharding-JDBC快速入門

2.1需求說明

使用Sharding-JDBC完成對訂單表的水平分表,通過快速入門程式的開發,快速體驗Sharding-JDBC的使用,人工創建兩張表,t_order_1和t_order_2,這張表是訂單表替換后的表,通過Shading-JDBC向訂單表插入資料,按照一定的分片規則,主鍵為偶數的盡入t_order_1,另一部分資料進入t_order_2,通過Shading-Jdbc查詢資料,根據SQL陳述句的內容從t_order_1或order_2查詢資料,

2.2. 環境建設

2.2.1環境說明

作業系統:Win10資料庫:MySQL-5.7.25 JDK:64位jdk1.8.0_201應用框架:spring-boot-2.1.3.RELEASE,Mybatis3.5.0 Sharding-JDBC:sharding-jdbc-spring-boot-starter-4.0 .0-RC1

2.2.2創建資料庫

創建訂單表

CREATE DATABASE`order_db`字符集'UTF8'COLLATE'utf8_general_ci'; ```在order_db中創建t_order_1,t_order_2表如果存在java DROP TABLE t_order_1; CREATE TABLE`t_order_1`(`order_id` BIGINT(20)非空注釋'訂單ID',`price`十進制(10,2)非空注釋'訂單價格',`user_id` BIGINT(20)非空注釋“下一個單用戶id”,“狀態” varchar(50)字符集utf8集合utf8_general_ci NOT NULL COMMENT“訂單狀態”,主鍵(`order_id`)使用BTREE)引擎= InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = 如果存在表t_order_2; CREATE TABLE`t_order_2`(`order_id` BIGINT(20)非空注釋'訂單ID',`price`十進制(10,2)非空注釋'訂單價格',`user_id` BIGINT(20)非空注釋'下一個單用戶id',`status` varchar(50)字符集utf8集合utf8_general_ci NOT NULL COMMENT'訂單狀態',主鍵(`order_id`)使用BTREE 
)ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT =動態; 

2.2.3約會maven依賴

sharding-jdbc和SpringBoot整合的Jar包:

<dependency>
<groupId>org.apache.shardingsphere</groupId> 
<artifactId>sharding‐jdbc‐spring‐boot‐starter</artifactId> 
<version>4.0.0‐RC1</version>
   </dependency>

2.3 撰寫程式

2.3.1 分片規則配置

分片規則配置是sharding-jdbc進行分庫分表操作的重要依據,配置內容包括 :資料源、主鍵生成策略等,
在application.properties中配置

server.port=56081
spring.application.name = sharding‐jdbc‐simple‐demo
 server.servlet.context‐path = /sharding‐jdbc‐simple‐demo spring.http.encoding.enabled = true spring.http.encoding.charset = UTF‐8 spring.http.encoding.force = true
spring.main.allow‐bean‐definition‐overriding = true
mybatis.configuration.map‐underscore‐to‐camel‐case = true # 以下是分片規則配置
# 定義資料源
spring.shardingsphere.datasource.names = m1
spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.m1.driver‐class‐name = com.mysql.jdbc.Driver spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/order_db?useUnicode=true spring.shardingsphere.datasource.m1.username = root spring.shardingsphere.datasource.m1.password = root
# 指定t_order表的資料分布情況,配置資料節點 spring.shardingsphere.sharding.tables.t_order.actual‐data‐nodes = m1.t_order_$‐>{1..2}
# 指定t_order表的主鍵生成策略為SNOWFLAKE spring.shardingsphere.sharding.tables.t_order.key‐generator.column=order_id spring.shardingsphere.sharding.tables.t_order.key‐generator.type=SNOWFLAKE
# 指定t_order表的分片策略,分片策略包括分片鍵和分片演算法 spring.shardingsphere.sharding.tables.t_order.table‐strategy.inline.sharding‐column = order_id spring.shardingsphere.sharding.tables.t_order.table‐strategy.inline.algorithm‐expression = t_order_$‐>{order_id % 2 + 1}
# 打開sql輸出日志 spring.shardingsphere.props.sql.show = true
swagger.enable = true
logging.level.root = info logging.level.org.springframework.web = info logging.level.com.itheima.dbsharding = debug logging.level.druid.sql = debug
  1. 首先定義資料源m1,并對m1進行實際的引數配置
  2. 指定t_order表的資料分布情況,它分布在m1.t_order_1、m1.t_order_2
  3. 指定t_order表的主鍵生成策略為SNOWFLAKE,SNOWFLAKE是一種分布式自增演算法,保證id全域唯一
  4. 定義t_order分片策略,order_id為偶數的資料落在t_order_1,為奇數的落在t_order_2,分表策略的運算式為t_order_$->{order_id % 2 + 1}

2.3.2 資料操作

   @Mapper
   @Component
   public interface OrderDao {
	/**
	* 新增訂單
	* @param price 訂單價格 * @param userId 用戶id * @param status 訂單狀態 * @return
	*/
	@Insert("insert into t_order(price,user_id,status) value(#{price},#{userId},#{status})")
	int insertOrder(@Param("price") BigDecimal price, @Param("userId")Long userId, @Param("status")String status);
	/**
	* 根據id串列查詢多個訂單
	* @param orderIds 訂單id串列 * @return
	*/
	@Select({"<script>" + "select " +
	"*"+
	" from t_order t" +
	" where t.order_id in " +
	"<foreach collection='orderIds' item='id' open='(' separator=',' close=')'>" + " #{id} " +
	"</foreach>"+
	"</script>"})
	List<Map> selectOrderbyIds(@Param("orderIds")List<Long> orderIds); 
}

2.3.3 測驗

撰寫單元測驗 :

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ShardingJdbcSimpleDemoBootstrap.class}) public class OrderDaoTest {
	@Autowired
	private OrderDao orderDao;
	@Test
	public void testInsertOrder(){
		for (int i = 0 ; i<10; i++){
			orderDao.insertOrder(new BigDecimal((i+1)*5),1L,"WAIT_PAY");
		} 
	}
	@Test
	public void testSelectOrderbyIds(){
		List<Long> ids = new ArrayList<>(); ids.add(373771636085620736L); ids.add(373771635804602369L);
		List<Map> maps = orderDao.selectOrderbyIds(ids); System.out.println(maps);
	} 
}

執行testInsertOrder:
https://img-blog.csdnimg.cn/20191219211246974.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_70
通過日志可以發現order_id為奇數的被插入到t_order_2表,為偶數的被插入到t_order_1表,達到預期目標,
執行testSelectOrderbyIds:
https://img-blog.csdnimg.cn /20191219211311247.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_70
通過日志可以發現,根據傳入的order_id的奇偶不同,分片-JDBC分別去不同的表檢索資料,達到預期目標,

2.4. 流程分析

通過日志分析,Sharding-JDBC在拿到用戶要執行的sql之后干了那些事兒 :
(1)決議sql,獲取片鍵值,在本例中是order_id
(2)Sharding-JDBC通過規則配置t_order_$->{order_id% 2 + 1},知道類當order_id為偶數時,應該往t_order_1表插資料,為奇數時,往t_order_2插資料,
(3)于是Sharding-JDBC根據order_id的值改寫sql陳述句,改寫后的SQL陳述句是真實所要執行的SQL陳述句,
(4)執行改寫后的真實sql陳述句
(5)將所有真正執行sql的結果進行匯總合并,回傳,

2.5 其他集成方式

Sharding-JDBC不僅可以與Spring boot良好集成,它還支持其他配置方式,共支持以下四種集成方式,
Spring Boot Yaml配置
定義application.yml,內容如下 :

server:
     port: 56081
     servlet:
context‐path: /sharding‐jdbc‐simple‐demo spring:
application:
name: sharding‐jdbc‐simple‐demo
     http:
       encoding:
enabled: true charset: utf‐8 force: true
main:
allow‐bean‐definition‐overriding: true
     shardingsphere:
       datasource:
         names: m1
m1:
type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/order_db?useUnicode=true username: root
password: mysql
       sharding:
         tables:
t_order:
actualDataNodes: m1.t_order_$‐>{1..2} tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: t_order_$‐>{order_id % 2 + 1}
             keyGenerator:
               type: SNOWFLAKE
               column: order_id
props: sql:
           show: true
   mybatis:
configuration: map‐underscore‐to‐camel‐case: true
   swagger:
     enable: true
   logging:
     level:
root: info
 org.springframework.web: info 
 com.itheima.dbsharding: debug 
 druid.sql: debug

如果使用application.yml則需要屏蔽原來的application.properties檔案,
Java配置
添加配置類 :

@Configuration
   public class ShardingJdbcConfig {
// 定義資料源
Map<String, DataSource> createDataSourceMap() {
DruidDataSource dataSource1 = new DruidDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setUrl("jdbc:mysql://localhost:3306/order_db?useUnicode=true"); dataSource1.setUsername("root");
dataSource1.setPassword("root");
Map<String, DataSource> result = new HashMap<>(); result.put("m1", dataSource1);
return result;
}
// 定義主鍵生成策略
private static KeyGeneratorConfiguration getKeyGeneratorConfiguration() {
KeyGeneratorConfiguration result = new KeyGeneratorConfiguration("SNOWFLAKE","order_id");
           return result;
       }
// 定義t_order表的分片策略
TableRuleConfiguration getOrderTableRuleConfiguration() {
TableRuleConfiguration result = new TableRuleConfiguration("t_order","m1.t_order_$‐> {1..2}");
result.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$‐>{order_id % 2 + 1}"));
result.setKeyGeneratorConfig(getKeyGeneratorConfiguration()); return result;
}
// 定義sharding‐Jdbc資料源
@Bean
DataSource getShardingDataSource() throws SQLException {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration()); //spring.shardingsphere.props.sql.show = true
Properties properties = new Properties();
properties.put("sql.show","true");
return ShardingDataSourceFactory.createDataSource(createDataSourceMap(),
     shardingRuleConfig,properties);
       }
}

由于采用類配置類所以需要屏蔽原來application.properties檔案中spring.shardingsphere開頭的配置資訊,還需要在SpringBoot啟動類中屏蔽使用spring.shardingsphere配置項的類 :

@SpringBootApplication(exclude = {SpringBootConfiguration.class}) public class ShardingJdbcSimpleDemoBootstrap {....}

Spring命名空間配置 此方式使用xml方式配置,不推薦使用,

<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:sharding="http://shardingsphere.apache.org/schema/shardingsphere/sharding"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring‐beans.xsd
http://shardingsphere.apache.org/schema/shardingsphere/sharding
http://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding.xsd http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring‐context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring‐tx.xsd">
<context:annotation‐config />
<!‐‐定義多個資料源‐‐>
<bean id="m1" class="com.alibaba.druid.pool.DruidDataSource" destroy‐method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/order_db_1?useUnicode=true" /> 
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!‐‐定義分庫策略‐‐>
<sharding:inline‐strategy id="tableShardingStrategy" sharding‐column="order_id" algorithm‐
expression="t_order_$‐>{order_id % 2 + 1}" /> 
<!‐‐定義主鍵生成策略‐‐>
<sharding:key‐generator id="orderKeyGenerator" type="SNOWFLAKE" column="order_id" />
<!‐‐定義sharding‐Jdbc資料源‐‐> <sharding:data‐source id="shardingDataSource">
<sharding:sharding‐rule data‐source‐names="m1"> 
<sharding:table‐rules>
<sharding:table‐rule logic‐table="t_order" table‐strategy‐ ref="tableShardingStrategy" key‐generator‐ref="orderKeyGenerator" />
</sharding:table‐rules> 
</sharding:sharding‐rule>
</sharding:data‐source> 
</beans>

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/29224.html

標籤:架構設計

上一篇:軟體設計的哲學:第十一章 兩次設計

下一篇:分庫分表之第三篇

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more