16 sharding jdbc原始碼分析之重寫

2021-08-20 04:23:37 字數 2216 閱讀 2540

核心原始碼就在sharding-jdbc-core模組的com.dangdang.ddframe.rdb.sharding.rewrite目錄下,包含兩個檔案sqlbuildersqlrewriteengine;測試用例入口為sqlrewriteenginetest,下面從sqlrewriteenginetest中debug原始碼分析sharding-jdbc的重寫是如何實現的:

sqlrewriteenginetest中某個測試用例如下–主要包括表名,offset,limit(rowcount)的重寫:

@test

public

void

assertrewriteforlimit()

重寫方法核心原始碼:

從這段原始碼可知,sql重寫主要包括對錶名,limit offset, rownum以及order by的重寫(itemstoken值對select col1, col2 from… 即查詢結果列的重寫–指那些由於ordre by或者group by需要增加的結果列);

public sqlbuilder rewrite(final

boolean isrewritelimit)

int count = 0;

// 根據token的beginposition即出現的位置排序

sortbybeginposition();

for (sqltoken each : sqltokens)

if (each instanceof tabletoken) else

if (each instanceof itemstoken) else

if (each instanceof rowcounttoken) else

if (each instanceof offsettoken) else

if (each instanceof orderbytoken)

count++;

}return result;

}private

void

sortbybeginposition()

});}

private

void

int count, final listsqltokens)

public

void

segments.add(new tabletoken(tablename));

currentsegment = new stringbuilder();

segments.add(currentsegment);

}

private

void

int count, final listsqltokens, final

boolean isrewrite)

private

void

int count, final listsqltokens, final

boolean isrewrite) else

if ((!selectstatement.getgroupbyitems().isempty() || !selectstatement.getaggregationselectitems().isempty()) && !selectstatement.issamegroupbyandorderbyitems()) else

int beginposition = rowcounttoken.getbeginposition() + string.valueof(rowcounttoken.getrowcount()).length();

}

private

void

int count, final listsqltokens, final

int beginposition)

重寫完後,呼叫sqlbuilder的tostring()方法生成重寫後最終的sql語句;

public string tosql(final maptabletokens)  else 

}return result.tostring();

}

16 LockSupport原始碼分析

locksupport原始碼分析 主要用於提供阻塞執行緒,和解除阻塞的方法。通過unsafe來實現的。屬性方法總結 final long parkblockeroffset 執行緒中parkblocker屬性的偏移量 可以通過該偏移位址獲取或者設定該字段的值,即修改獲取thread下的parkblo...

lodash原始碼分析之去重 uniq方法

lodash.js包是node開發中常用的js工具包,裡面有許多實用的方法,今天分析常用的乙個去重方法 uniq 用法 uniq 2,1,2 2,1 原始碼包 uniq.js import baseuniq from internal baseuniq.js function uniq array ...

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...