摘要: 前段時間我們的系統(tǒng)接到新增多一個頻道的需求,原本我們的系統(tǒng)只是針對于廣州的業(yè)務(wù),現(xiàn)在需要新增另一個城市上海,經(jīng)過和產(chǎn)品人員溝通和分析,城市之間的業(yè)務(wù)邏輯除了一些小差異基本還是一樣的,數(shù)據(jù)庫的結(jié)構(gòu)經(jīng)過整合兩個城市也可以達(dá)到一樣的結(jié)構(gòu),但上海需要獨(dú)立出另一個數(shù)據(jù)庫.
我們以前發(fā)布器的做法是用作為方法的一個參數(shù)由調(diào)用者一直傳到訪問對象(索引或數(shù)據(jù)庫),雖然這種做法一樣可以很快的實(shí)現(xiàn),但是將數(shù)據(jù)庫,索引的選擇和業(yè)務(wù)邏輯混搭在一起的設(shè)計在感覺上是比較混亂,并且不利于將來多個城市(頻道)的建立,所以選了通過ThreadLocal來實(shí)現(xiàn)多數(shù)據(jù)源的動態(tài)切換.
ThreadLocal 是一個依賴于執(zhí)行線程的存儲器,對它就只有簡單的一個set和get方法,不同線程之間是相互獨(dú)立的。簡單地講,就是:這個線程set了一個對象入去,只有這個線程自己可以把它get出來,其它線程是get不出來的。
好了,下面是具體顯示的方式
首先定義一個filter,通過filter取得域名,因?yàn)槲覀兊挠蛎袔в谐鞘械臉?biāo)志,如廣州是http://gz.***.
閱讀全文