sharding-jdbc使用總結

sharding-jdbc

由于生產或者QA環(huán)境下的數(shù)據庫是按主從進行部署,在業(yè)務上默認讀操作會使用從庫查詢來實現(xiàn)與主庫的讀寫分離,提高性能掀宋。但是不可避免的是 主從延遲 的存在扎唾,此時就需要我們切換到主庫進行查詢操作,來保證業(yè)務的正常執(zhí)行械媒。在現(xiàn)有技術棧背景下,是通過使用sharding-jdbc的主庫路由切換到主庫上的评汰。主庫路由在使用上需要注意下面幾個點:

在進行數(shù)據庫路由的時候會使用到HintManager.getInstance() 纷捞,它會將HintManager實例放入ThreadLocal中,該ThreadLocal清除的方式有兩種:

  • 調用HintManager.close()手動清除
  • 由sharding-jdbc自動支持被去,當數(shù)據庫連接被歸還到連接池后自動清除

自動清除的方式又可以分為兩種:

  • 有事務主儡,當前事務執(zhí)行結束之后,會釋放連接编振,同時清除該ThreadLocal
  • 沒有事務缀辩,spring-data-jpa的方法 findone等,或者native sql 執(zhí)行完成之后也會釋放連接踪央,同時清除ThreadLocal

如果不清除該ThreadLocal會導致什么后果臀玄?

  • 當下次請求到同一線程的時候,調用HintManager.getInstance()發(fā)現(xiàn)ThreadLocal中已經有值了畅蹂,拋出異常
  • 等待GC清除ThreadLocal健无,由于ThreadLocal中在存儲結構實際上是一個weakReference,gc發(fā)生會清除弱引用液斜,但是實際上存儲的實例還在累贤,與此同時這就導致了造成了內存泄漏(實際上不會有這種情況,因為HintManager使用的ThreadLocal是靜態(tài)成員變量)

需要避免下面這種錯誤寫法:

void test() {
    HintManager hintManager = HintManager.getInstance();
    hintManager.setMasterRouteOnly();
    // 1.做了一些其它非數(shù)據庫的操作少漆,可能會出現(xiàn)異常(比如查詢redis, 數(shù)據校驗等)
    pupuRedissonHash.getMulti();
    // 2.查詢數(shù)據庫
    repository.findOne();
}
  • 上面這段代碼如果在1中出現(xiàn)了異常臼膏,會導致ThreadLocal沒有被清除,再下次請求用到了同一個線程(比如dubbo線程)就出現(xiàn)異常
  • 上面這段代碼如果能正常的執(zhí)行到2的話示损,一旦2執(zhí)行結束后就會清除ThreadLocal渗磅,保證了下次請求使用到相同線程的正常執(zhí)行

在討論過了ThreadLocal清除方式的情況下,可以發(fā)現(xiàn)下述代碼產生的兩種不同情況了:

// 沒有事務先主庫路由检访,再多次查詢
void testNoTransaction() {
    HintManger hintManager = HintManger.getInstance();
    hintManager.setMasterRouteOnly();
    repository.findOne(); // 1. 查詢的是主庫始鱼,同時清除ThreadLocal
    repository.findOne(); // 2. 查詢的是從庫,因為ThreadLocal被清除了
}

// 有事務先主庫路由脆贵,再多次查詢
@Transactional
void testHasTransaction() {
    HintManger hintManager = HintManger.getInstance();
    hintManager.setMasterRouteOnly();
    repository.findOne(); // 1. 查詢的是主庫医清,事務還沒結束,不清除ThreadLocal
    repository.findOne(); // 2. 查詢的是主庫卖氨,因為ThreadLocal還沒被清除
} // 事務結束会烙,歸還數(shù)據庫連接负懦,清除ThreadLocal

在討論完了自動清除的場景,下述代碼表述了手動清除ThreadLocal:

// 使用try finally進行清除
void testManualClearByTryFinally(DTO dto) {
    HintManger hintManager = HintManger.getInstance();
    hintManager.setMasterRouteOnly();
    try {
      checkDTO(dto);
      redissonHash.getMulti();
      repository.findOne();  
    } finally {
      hintManager.close();
    }
}

// 使用try-with-resource進行清除
void testManualClearByTryWithResource(DTO dto) {
    try (HintManager ignored = routeToMaster()) {
      checkDTO(dto);
      redissonHash.getMulti();
      repository.findOne();  
    }
}

HintManager routeToMaster() {
    HintManger hintManager = HintManger.getInstance();
    hintManager.setMasterRouteOnly();
    return hintManager;
}

建議:在使用HintManager.getInstance()后持搜,不確定在此之后執(zhí)行的代碼是否會出現(xiàn)異常的情況下密似,使用try finally或者try-with-resource手動清除ThreadLocal

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葫盼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌村斟,老刑警劉巖贫导,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蟆盹,居然都是意外死亡孩灯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門逾滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峰档,“玉大人,你說我怎么就攤上這事寨昙〖パ玻” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵舔哪,是天一觀的道長欢顷。 經常有香客問我,道長捉蚤,這世上最難降的妖魔是什么抬驴? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮缆巧,結果婚禮上布持,老公的妹妹穿的比我還像新娘。我一直安慰自己陕悬,他們只是感情好题暖,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著墩莫,像睡著了一般芙委。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狂秦,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天灌侣,我揣著相機與錄音,去河邊找鬼裂问。 笑死侧啼,一個胖子當著我的面吹牛牛柒,可吹牛的內容都是我干的。 我是一名探鬼主播痊乾,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼皮壁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哪审?” 一聲冷哼從身側響起蛾魄,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎湿滓,沒想到半個月后滴须,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叽奥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年扔水,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朝氓。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡魔市,死狀恐怖,靈堂內的尸體忽然破棺而出赵哲,到底是詐尸還是另有隱情待德,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布誓竿,位于F島的核電站磅网,受9級特大地震影響,放射性物質發(fā)生泄漏筷屡。R本人自食惡果不足惜涧偷,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毙死。 院中可真熱鬧燎潮,春花似錦、人聲如沸扼倘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽再菊。三九已至爪喘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纠拔,已是汗流浹背秉剑。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稠诲,地道東北人侦鹏。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓诡曙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親略水。 傳聞我的和親對象是個殘疾皇子价卤,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容