關於分庫分表的實現

2021-08-17 03:02:44 字數 2963 閱讀 3891

無論怎麼做分庫分表,其基本思路都是一樣的。需要有分庫路由,分庫規則,分庫關鍵字等。

下面簡單用spring在dao層做乙個分庫的實現。假如有2個資料來源,通過在routekey選擇不同的資料來源。

設計路由關鍵字

public

enum routekey

}public

static routekey convertroutekey(string key)

}

設計路由註解

@retention(retentionpolicy.runtime)

@target(elementtype.method)

@documented

public @inte***ce

datasourceconfig

路由規則實現,利用了spring的aop思想,對dao方法做個攔截,進來做到對應用的無侵入性。根據傳入的引數,繫結不同的路由key到當前執行緒,為了後續獲取connection時候需要。

@component

@aspect

//@order(0)

public

class

datasourceaspect

paramnames = names;}}

object args = joinpoint.getargs();

routekey routekey;

int i = 0;

for (string name : paramnames)

i++;

}try finally

}}

擴充套件abstractroutingdatasource類,過載determinecurrentlookupkey方法,路由到不同的庫

public

class

customdatasource

extends

abstractroutingdatasource

}

datasourcekeyholder是個threadlocal,將路由key繫結到當前執行緒。spring很多涉及事務操作的都會用到threadlocal。

public

class datasourcekeyholder

};public

static routekey getroutekey()

public

static

void

setroutekey(routekey key)

public

static

void

clear()

}

資料來源配置。spring事務會在方法前獲取資料連線connection,但是這時還沒有到dao層進行路由選擇,因此需要延遲載入資料來源,需要用到lazyconnectiondatasourceproxy。

class="org.springframework.jdbc.datasource.drivermanagerdatasource">

name="driverclassname" value="com.mysql.jdbc.driver"/>

name="url" value="jdbc:mysql://localhost:3306/example"/>

name="username" value="root"/>

name="password" value="123456"/>

id="datasource2"

class="org.springframework.jdbc.datasource.drivermanagerdatasource">

name="driverclassname" value="com.mysql.jdbc.driver"/>

name="url" value="jdbc:mysql://localhost:3306/example2"/>

name="username" value="root"/>

name="password" value="123456"/>

id="datasource"

class="com.ydoing.spring.core.transaction.customdatasource">

name="targetdatasources">

"current" value-ref="datasource1"/>

"history" value-ref="datasource2"/>

property>

id="lazydatasource"

class="org.springframework.jdbc.datasource.lazyconnectiondatasourceproxy">

name="targetdatasource"

ref="datasource"/>

id="txmanager"

class="org.springframework.jdbc.datasource.datasourcetransactionmanager">

name="datasource"

ref="lazydatasource"/>

transaction-manager="txmanager" />

id="jdbctemplate"

class="org.springframework.jdbc.core.jdbctemplate">

name="datasource"

ref="lazydatasource"/>

怎麼使用?

@transactional

@datasourceconfig(key = "key")

public

void

update(routekey key)

mysql分表分庫實現 MySql分表分庫思路

一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...

關於分庫分表 Mysql篇

關於分庫分表,要關心硬體,業務,分布式,和資料庫選型.基本指標 庫物理檔案大小 100g 表 100 字段 200 單錶記錄數 500w 可以用說用到mysql的地方,只要資料量一大,馬上就會遇到乙個問題,要分庫分表.這裡引用乙個問題為什麼要分庫分表呢?mysql處理不了大的表嗎?其實是可以處理的大...

關於MySQL分庫分表緣由

關於分庫分表,要關心硬體,業務,分布式,和資料庫選型.基本指標 庫物理檔案大小 100g 表 100 字段 200 單錶記錄數 500w 分庫分表直接目的是要控制表的數量,控制資料的容量,最終的目的是降低響應延遲,更容易的運維 可以用說用到mysql的地方,只要資料量一大,馬上就會遇到乙個問題,要分...