Mybatis-Plus多數據源使用多線程時失效的問題

最近遇到了一個大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

相關文章
相關標籤/搜索