當資料大的時候,都會考慮分庫分表的實現。分庫分表可以在不同的層做。一般來說有以下幾種:
無論怎麼做分庫分表,其基本思路都是一樣的。需要有分庫路由,分庫規則,分庫關鍵字等。
下面簡單用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。
最後使用
@transactional
@datasourceconfig(key = "key")
public void update(routekey key)
如何分庫分表
分表是分散資料庫壓力的好方法。分表,最直白的意思,就是將乙個表結構分為多個表,然後,可以再同乙個庫里,也可以放到不同的庫。當然,首先要知道什麼情況下,才需要分表。個人覺得單錶記錄條數達到百萬到千萬級別時就要使用分表了。1,分表的分類 1 縱向分表 將本來可以在同乙個表的內容,人為劃分為多個表。所謂的...
mysql分表分庫實現 MySql分表分庫思路
一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...
MySQL範圍分表分庫 mysql 分表分庫策略
唯一id的生成 下面列舉幾種常見的唯一id生成方案,需要滿足兩大核心需求 1.全域性唯一 2趨勢有序 1.用資料庫的auto increment 自增id 來生成,每次通過寫入資料庫一條記錄,利用資料庫id自增的特性獲取唯一,有序的id。優點 使用資料庫原有的功能,相對簡單 能夠保證唯一 能夠保證遞...