這兩天做到一個需求幅慌,需要一次性將一張數(shù)據(jù)表里的所有資源數(shù)據(jù)中的位置信息錄入到redis中宋欺,表中的數(shù)據(jù)有幾百萬起步轰豆,采用的是java定時任務胰伍,循環(huán)每次查出一萬條數(shù)據(jù)存入redis齿诞,測試時發(fā)現(xiàn)插入效率非常慢,經過排查發(fā)現(xiàn)是通過mybatis查詢數(shù)據(jù)的耗時超過了總耗時的99%骂租,我這臺機器上是每查詢一萬條數(shù)據(jù)返回耗時87s左右祷杈。
解決方法:
在mapper.xml中的<select>中加入fetchSize參數(shù),設置的大一些渗饮,如下:
設置完后一次查詢一萬條返回由原來的87秒變成了毫秒級別
我也是第一次用這個參數(shù)但汞,這效果,感覺非常神奇互站!
簡單參數(shù)解析:
通過JDBC取數(shù)據(jù)時私蕾,默認是10條數(shù)據(jù)取一次,即fetch size為10(根據(jù)oracle的文檔胡桃,默認的fetchSize是10)踩叭,如果增大這個數(shù)字可以減少客戶端與oracle的往返,減少響應時間翠胰,網上有建議這個數(shù)字不要超過100容贝,要不然對中間件內存消耗大。
雖然說超過100不好之景,但是我設置了10000斤富,結果看我的破電腦還是扛得住的,但是本著專研精神锻狗,我將fatch size設置為1000满力,看看效果會不會打折扣,結果用時如下:
確實容量設小了后速度有所折扣轻纪。
總結:
在使用mybatis一次查詢大量數(shù)據(jù)時確實可以通過怎大fatchSize的值來大大提高查詢效率脚囊,使用也非常簡單,具體fatchSize設為多少要根據(jù)自己具體的業(yè)務需要和機器的配置來綜合判定桐磁。
待解決問題
以上方式在xml中可以輕松設置悔耘,但是使用mybatis-plus的簡單查詢時并不用手動寫xml查詢,我也不知道如何定制其fatchSize的值我擂,我目前的解決方式是手動在xml中再寫一個查詢方法來調用衬以,但是感覺這樣做非常的麻煩,如果你知道如何在調用mybatis-plus的BaseMapper查詢方法時配置fatchSize校摩,請留言告知看峻,十分感謝!