無論怎麼做分庫分表,其基本思路都是一樣的。需要有分庫路由,分庫規則,分庫關鍵字等。
下面簡單用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的地方,只要資料量一大,馬上就會遇到乙個問題,要分...