最近遇到了一個大boss親自負責的項目,爲了快速交付,避免007,因此用到了mybatis-plus多數據源來處理跨庫的狀況。正當髮際線穩步靠近腳後跟的過程當中,遇到了一特別不起眼的功能:須要在每一個庫裏都查一點數據,而後在代碼裏作數據的彙總。數據庫
這種比芝麻還小的功能,確實不值得寫一篇文章來佔用寶貴的互聯網資源。可是,在按照我本身的想法實現這個功能時,出問題了。mybatis
想法特別簡單:當須要查詢n個數據庫時,我建立n個線程,每一個線程去對應的庫裏拿到數據。ide
Mybatis-Plus
多數據源使用也是極爲方便,使用@DS
註解便可。可是無論加在類上仍是加在實現接口的方法上,均不能正確的找到對應的數據庫,全部的線程都抓着主數據庫不放。編碼
幾經周折,屢次試驗,最終將多數據源的註解聲明在了Callable
實現類的call
方法上,而且須要用編碼的方式,設置當前線程數據源名稱,並在當前線程執行結束後,再將其清除掉。線程
import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
@Override public Future<Map<String, Object>> getTableOverview(CountDownLatch latch) { return executor.submit(new Callable<Map<String, Object>>() { @DS("slave") @Override public Map<String, Object> call() throws Exception { // 設置當前線程數據源 DynamicDataSourceContextHolder.push("slave"); Map<String, Object> result; try { // 查詢數據庫方法 result = getTableData(); } finally { latch.countDown(); // 強制清空本地線程,防止內存泄漏,手動調用push可調用此方法確保清除 DynamicDataSourceContextHolder.clear(); } return result; } }); }
珍愛秀髮,遠離編碼code