核心原始碼就在sharding-jdbc-core
模組的com.dangdang.ddframe.rdb.sharding.rewrite
目錄下,包含兩個檔案sqlbuilder和sqlrewriteengine;測試用例入口為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...