zebra 是美團點評開發的資料庫訪問層中介軟體,**維護在 github:meituan-dianping/zebra
zebra是乙個基於jdbc api協議上開發出的高可用、高效能的資料庫訪問層解決方案,是美團點評內部使用的資料庫訪問層中介軟體。具有以下的功能點:zebra 的 quickstart 提供了完整的使用說明文件,這裡就不再贅述用法,而是直接提供乙個使用 zebra 進行資料庫分表的 demo。
資料庫表為簽到表(sign_in),表結構如下:
簽到表用於記錄使用者簽到資料,customer_id 為使用者 id,其餘欄位是為了 demo 測試而建,無特殊含義。
選擇簽到表的 customer_id 作為維度。
選取維度時需要考慮下面的情況:
在 sql 語句中,顧客 customer_id 是在 crud 操作中作為查詢目標屬性和條件屬性**現次數最多的字段,這樣能滿足 zebra 要求中的維度必須出現在 sql 語句中的限制;同時很多查詢,檢索的 sql 都是基於同一顧客進行的,方便業務邏輯變更;此外,顧客 id 在簽到表中與主鍵直接相關,一條簽到記錄必然有乙個顧客 id ,根據顧客 id 能更快的定位簽到記錄所在範圍。
<?xml version="1.0" encoding="utf-8"?>
>> 16)))"
tbsuffix="everydb:[0,4]"
ismaster="true">
通過維度和路由規則定位到對應表的過程,在針對簽到表的 crud 操作中,通過維度 customer_id 字段及其值,經路由規則計算後能定位到對應表。
資料庫的路由規則
dbrule="#customer_id# * 0"
單庫,無需定義規則,指出 [維度] 即可。
資料庫名字尾
dbindexes="db"
與zebra配置中的sharddatasource資料來源的key相同即可。
表的路由規則
主表:sign_in
維度:key
表下標偏移:offset
表數量:len
雜湊值:hash = crc32(key)
擾動函式:ha = (hash ^ (hash >>> 16))
取模運算:in = (len - 1) & ha
對映到的表下標:index = offset + in
tbrule: offset + ((len - 1) & (crc32(key) ^ (crc32(key) >>> 16)))
如:offset = 3,len = 2,key 為 #customer_id#
tbrule = "3 + ((2 - 1) & (crc32(#customer_id#) ^ ((crc32(#customer_id#) >>> 16)))"
在表sign_in3,sign_in4中路由。
注意:說明:
表名字尾
tbsuffix="everydb:[0,999]"
everydb:[a,b]:a始終為0,b不小於實際表的最大index即可。
主維度ismaster="true"
只有乙個維度
部分測試 sql 如下:
insert into sign_in (id, customer_id, date, current_sign_in_store_id, type, create_eid, create_date)
value (#, #, #, #, #, #, now())
select *
from sign_in
where customer_id = #;
select *
from sign_in
where id = #
指定 customerid ,執行 sql 時將被路由到具體的分表中。
private void testinsert()
}
完整**上傳 github,你可以在 這裡 找 對資料庫進行操作
對資料庫進行操作 一 ddl 資料庫定義語言 對資料庫 表結構進行操作 建庫 建表 修改表結構 刪庫 刪表等等 sql語句大小寫不敏感 1.建立資料庫 2.顯示所有的資料庫 3.切換到要使用的資料庫,use 資料庫名稱 4.4.刪除資料庫 drop database if exists 資料庫名 5...
使用sequelize對資料庫進行增刪改查
首先我們需要在自己的資料夾下執行一下cmd npm init y y 的主要目的是跳過配置一系列的package.json 其次我們需要安裝兩個sequelize和mysql2 yarn add sequelize mysql2 s 或者npm install sequelize mysql2 s ...
使用sql進對資料庫表資料進行先分組後排序
在實際業務中,有一些場景需要對一組列表資料先分組後然後組內排序,這時不能單純的使用傳統的group by和order by語句了,因為會提示 x欄位必須在group by聚合函式中,為了解決此問題,我們可以使用row number over partition by 分組字段 order by 排序...