Mybatis 流式讀取大量MySQL數(shù)據(jù)
回復架構師獲取資源
大家好,我是你們的朋友架構君,一個會寫代碼吟詩的架構師。
'javajgs.com';
最近公司提了個需求 ,說公司的舊系統(tǒng)的報表導出的時候,數(shù)據(jù)量超過一萬就導不出來了。經(jīng)過分析,是舊系統(tǒng)做了限制。在更新的時候,查看了導出時虛擬機GC情況,發(fā)現(xiàn)原先程序執(zhí)行時,內存激增,經(jīng)過Google決定采用流式讀取對sql進行優(yōu)化。
JDBC三種讀取方式:
1、 一次全部(默認):一次獲取全部;
2、 流式:多次獲取,一次一行;
3、 游標:多次獲取,一次多行;
mybatis默認采取第一種。
開發(fā)環(huán)境:
jdk1.8 、intellij IDEA 2018
mybatis 3 、 springMVC 、Spring 4
實現(xiàn)步驟:
實現(xiàn)流式讀取的方式不止一種,但是我只能說我解決的這種,對不起,我不是大神級的。
這里采用的 controller、service、dao分層開發(fā)
在service層調用dao接口是,增加一個回調參數(shù) ResultHandler <>。對應的dao接口返回值為void mapper 填寫 parameterType、resultMap、 resultSetType=“FORWARD_ONLY”、 fetchSize="-2147483648"
為什么dao返回值為void還要在mapper寫resultMap?因為回調要用你的resultMap處理,但是不應該返回給service,因為回調處理好了
示例代碼
controller層:
@RequestMapping("/export")
public void export(Vo vo, String props,
HttpServletResponse response) {
//.......
list = ossVipCustomService.selectForwardOnly(vo, Order.build());
//......
}
我推薦一套,架構師視頻 155G 太全了
https://mp.weixin.qq.com/s/PoWsCNFAe_MlV_oANsfBT
service層:(重點)
public List<Bo> selectForwardOnly(Vo vo, Order order) {
final List<Bo> list = new ArrayList<>();
mapper.selectForwardOnly(vo, order, new ResultHandler<Bo>() {
@Override
public void handleResult(ResultContext<? extends Bo> resultContext) {
/**回調處理邏輯 */
list.add(resultContext.getResultObject());
}
});
return list;
}
dao層:(重點)
/**
* 流式讀取數(shù)據(jù)
* @param vo 查詢對象
* @param order 排序
* @param ossVipCustomerBoResultHandler 回調處理
*/
void selectForwardOnly(@Param("record") Vo vo, @Param("order") Order order,
ResultHandler<Bo> handler);
mapper:(重點)
<select id="selectForwardOnly"
parameterType="com.*.Vo" resultMap="GetListBo"
resultSetType="FORWARD_ONLY" fetchSize="-2147483648">
SELECT
*
FROM
customer
</select>
個人原因:刪除非關鍵部分代碼。你肯定看的懂得。
心路歷程
Google了好久的一個原因,就是因為dao接口不應該返回值的。還麻煩了老大過來看了一眼。
還有就是google出來的那些,要改框架配置的,我的確跟著改了,改了mysql連接參數(shù),還有mybatis setting的配置。嗯,沒用
來源:suveng.blog.csdn.net/article/details/85100239
這些年小編給你分享過的干貨
2.優(yōu)質ERP系統(tǒng)帶進銷存財務生產(chǎn)功能(附源碼)
3.優(yōu)質SpringBoot帶工作流管理項目(附源碼)
5.SBoot+Vue外賣系統(tǒng)前后端都有(附源碼)

轉發(fā)在看就是最大的支持??
