电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解

瀏覽:26日期:2023-08-25 17:26:53
概述

本篇博客是記錄使用spring batch做數(shù)據(jù)遷移時(shí)時(shí)遇到的一個(gè)關(guān)鍵問題:數(shù)據(jù)遷移量大時(shí)如何保證內(nèi)存。當(dāng)我們?cè)谑褂胹pring batch時(shí),我們必須配置三個(gè)東西: reader,processor,和writer。其中,reader用于從數(shù)據(jù)庫中讀數(shù)據(jù),當(dāng)數(shù)據(jù)量較小時(shí),reader的邏輯不會(huì)對(duì)內(nèi)存帶來太多壓力,但是當(dāng)我們要去讀的數(shù)據(jù)量非常大的時(shí)候,我們就不得不考慮內(nèi)存等方面的問題,因?yàn)槿魯?shù)據(jù)量非常大,內(nèi)存,執(zhí)行時(shí)間等等都會(huì)受到影響。關(guān)于spring batch的基礎(chǔ)知識(shí)和介紹請(qǐng)參考這篇博客:批處理框架spring batch介紹及使用。

問題是什么

在上面的內(nèi)容當(dāng)中我們已經(jīng)提到了,我們面臨的問題是數(shù)據(jù)遷移量大時(shí)的內(nèi)存問題。但是這樣的描述非?;\統(tǒng),因此博主決定將這一部分單獨(dú)拎出來說。

在學(xué)習(xí)了spring batch的知識(shí)之后我們應(yīng)該很清楚的一點(diǎn)是,每一個(gè)spring batch的step都包含如下的部分:

spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解

即讀數(shù)據(jù),處理數(shù)據(jù),寫數(shù)據(jù)。這三個(gè)步驟里面最可能會(huì)導(dǎo)致內(nèi)存變大問題的無疑是讀數(shù)據(jù)環(huán)節(jié)。讀數(shù)據(jù)作為spring batch的數(shù)據(jù)輸入,是整個(gè)spring batch job的開頭邏輯。

若我們的數(shù)據(jù)量不大,如只有幾十萬條,那我們無疑不會(huì)面臨內(nèi)存問題,即便一次將所有數(shù)據(jù)加載到內(nèi)存當(dāng)中,占的內(nèi)存也不會(huì)非常多,且spring batch數(shù)據(jù)遷移的速度非常之快,幾十萬條的數(shù)據(jù)往往是幾十秒的時(shí)間就可以遷移完成。但是當(dāng)數(shù)據(jù)量變大之后,問題就不一樣了。當(dāng)我們的數(shù)據(jù)量達(dá)到數(shù)百萬或上千萬時(shí),若一次性將所有數(shù)據(jù)全部讀到內(nèi)存當(dāng)中,則會(huì)占據(jù)遠(yuǎn)遠(yuǎn)超出正常范圍的非常大的內(nèi)存。該問題示意圖如下所示:

spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解

我們寫的任何程序都會(huì)有一個(gè)運(yùn)行內(nèi)存,假設(shè)這個(gè)內(nèi)存的總?cè)萘楷F(xiàn)在只有4g,而我們數(shù)據(jù)庫里需要操作的數(shù)據(jù)有8g,那么無疑,一次性的將數(shù)據(jù)讀出來就會(huì)出錯(cuò)。這便是需要考慮得問題。

Spring提供的reader實(shí)現(xiàn)

spring提供了非常豐富的Reader實(shí)現(xiàn),其中比較常用的從數(shù)據(jù)庫讀數(shù)據(jù)的有JdbcCursorItemReader,JdbcPagingItemReader等。

JdbcCursorItemReader

使用JdbcCursorItemReader的示例代碼如下:

@Beanpublic JdbcCursorItemReader<CustomerCredit> itemReader() { return new JdbcCursorItemReaderBuilder<CustomerCredit>() .dataSource(this.dataSource) .name('creditReader') .sql('select ID, NAME, CREDIT from CUSTOMER') .rowMapper(new CustomerCreditRowMapper()) .build(); }

JdbcCursorItemReader的好處在于使用簡(jiǎn)單,但是我們從它的sql就能發(fā)現(xiàn),JdbcCursorItemReader會(huì)一次把所有的數(shù)據(jù)全部拿回來,當(dāng)數(shù)據(jù)量過大而服務(wù)器內(nèi)存不夠時(shí),就會(huì)遇到下面無法分配內(nèi)存的問題:

spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解

報(bào)錯(cuò)信息為:Resource exhaustion event:The JVM was unable to allocate memory from the heap. 意思就是需要分配內(nèi)存的數(shù)據(jù)太多,但是無法找到足夠的內(nèi)存了。

反映在內(nèi)存里,堆內(nèi)存會(huì)呈現(xiàn)出如下的情況:

spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解

隨著每一次數(shù)據(jù)讀入,堆內(nèi)存都會(huì)增大,原因就在于JdbcCursorItemReader一次性讀回了所有的數(shù)據(jù),返回之后就會(huì)存在一個(gè)對(duì)象里面,而這個(gè)對(duì)象的尺寸過大,因此直接進(jìn)入了老年代。在數(shù)據(jù)遷移完成之前,這些數(shù)據(jù)都不會(huì)被回收。如下圖所示:

spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解

毫無疑問,當(dāng)我們的數(shù)據(jù)量大時(shí)不應(yīng)該使用這種類型的reader來讀取數(shù)據(jù)。

JdbcPagingItemReader

JdbcPagingItemReader的作用和它的名字一樣,它可以分頁讀取數(shù)據(jù),但是使用起來相比于JdbcCursorItemReader更加復(fù)雜,示例代碼如下:

@Beanpublic JdbcPagingItemReader itemReader(DataSource dataSource, PagingQueryProvider queryProvider) { Map<String, Object> parameterValues = new HashMap<>(); parameterValues.put('status', 'NEW'); return new JdbcPagingItemReaderBuilder<CustomerCredit>() .name('creditReader') .dataSource(dataSource) .queryProvider(queryProvider) .parameterValues(parameterValues) .rowMapper(customerCreditMapper()) .pageSize(1000) .build();} @Beanpublic SqlPagingQueryProviderFactoryBean queryProvider() { SqlPagingQueryProviderFactoryBean provider = new SqlPagingQueryProviderFactoryBean(); provider.setSelectClause('select id, name, credit'); provider.setFromClause('from customer'); provider.setWhereClause('where status=:status'); provider.setSortKey('id'); return provider;}

可以看到我們能夠設(shè)置page的大小,JdbcPagingItemReader將根據(jù)這個(gè)頁的大小,每次讀取這么多的數(shù)據(jù),因此這些數(shù)據(jù)返回保存的對(duì)象,就只會(huì)是小對(duì)象,因此他們不會(huì)直接在老年代里分配,而是先分配在年輕代,隨著年輕代不斷變大,minor gc也不斷進(jìn)行,回收掉已經(jīng)處理完的數(shù)據(jù),老年代的內(nèi)存使用量不會(huì)有任何增大,類似下圖:

spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解

spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解

老年代內(nèi)存不會(huì)有任何變化,年輕帶會(huì)隨著服務(wù)器數(shù)據(jù)遷移進(jìn)行而增大同時(shí)被回收。

在使用JdbcPagingItemReader時(shí),有一個(gè)必須注意的地方就是排序關(guān)鍵字是必須指定的,原因在于排序是分頁實(shí)現(xiàn)原理的技術(shù)基礎(chǔ)。sortKey和我們指定的其他字句一起構(gòu)建出SQL語句出來。在sortKey上必須使用unique key constraint約束,因?yàn)橹挥羞@樣才能得以確保執(zhí)行之間不會(huì)丟失任何數(shù)據(jù)。這也可以說是JdbcCursorItemReader相對(duì)便利的一點(diǎn)優(yōu)勢(shì)。

總結(jié)

數(shù)據(jù)量小時(shí)選擇的方案差別不會(huì)很大,當(dāng)數(shù)據(jù)量大時(shí),為了有好的內(nèi)存表現(xiàn)則使用分頁的reader是必要的。但同時(shí),因?yàn)橐獙?shí)現(xiàn)分頁,也會(huì)帶來一些不可避免的限制。

到此這篇關(guān)于spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解的文章就介紹到這了,更多相關(guān)spring batch使用reader讀數(shù)據(jù)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | 净气型药品柜-试剂柜-无管道净气型通风柜-苏州毕恩思 | 办公室家具公司_办公家具品牌厂家_森拉堡办公家具【官网】 | 皮带机-带式输送机价格-固定式胶带机生产厂家-河南坤威机械 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 中国产业发展研究网 - 提供行业研究报告 可行性研究报告 投资咨询 市场调研服务 | 行星齿轮减速机,减速机厂家,山东减速机-淄博兴江机械制造 | 自动气象站_农业气象站_超声波气象站_防爆气象站-山东万象环境科技有限公司 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 金蝶帐无忧|云代账软件|智能财税软件|会计代账公司专用软件 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | 福兰德PVC地板|PVC塑胶地板|PVC运动地板|PVC商用地板-中国弹性地板系统专业解决方案领先供应商! 福建成考网-福建成人高考网 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 二手色谱仪器,十万分之一分析天平,蒸发光检测器,电位滴定仪-湖北捷岛科学仪器有限公司 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 压力变送器-上海武锐自动化设备有限公司 | 全屋整木定制-橱柜,家具定制-四川峨眉山龙马木业有限公司 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 集菌仪厂家_全封闭_封闭式_智能智能集菌仪厂家-上海郓曹 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | 湖南自考_湖南自学考试网 | 飞飞影视_热门电影在线观看_影视大全 |