日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

spring batch使用reader讀數據的內存容量問題詳解

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

本篇博客是記錄使用spring batch做數據遷移時時遇到的一個關鍵問題:數據遷移量大時如何保證內存。當我們在使用spring batch時,我們必須配置三個東西: reader,processor,和writer。其中,reader用于從數據庫中讀數據,當數據量較小時,reader的邏輯不會對內存帶來太多壓力,但是當我們要去讀的數據量非常大的時候,我們就不得不考慮內存等方面的問題,因為若數據量非常大,內存,執行時間等等都會受到影響。關于spring batch的基礎知識和介紹請參考這篇博客:批處理框架spring batch介紹及使用。

問題是什么

在上面的內容當中我們已經提到了,我們面臨的問題是數據遷移量大時的內存問題。但是這樣的描述非常籠統,因此博主決定將這一部分單獨拎出來說。

在學習了spring batch的知識之后我們應該很清楚的一點是,每一個spring batch的step都包含如下的部分:

spring batch使用reader讀數據的內存容量問題詳解

即讀數據,處理數據,寫數據。這三個步驟里面最可能會導致內存變大問題的無疑是讀數據環節。讀數據作為spring batch的數據輸入,是整個spring batch job的開頭邏輯。

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

spring batch使用reader讀數據的內存容量問題詳解

我們寫的任何程序都會有一個運行內存,假設這個內存的總容量現在只有4g,而我們數據庫里需要操作的數據有8g,那么無疑,一次性的將數據讀出來就會出錯。這便是需要考慮得問題。

Spring提供的reader實現

spring提供了非常豐富的Reader實現,其中比較常用的從數據庫讀數據的有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的好處在于使用簡單,但是我們從它的sql就能發現,JdbcCursorItemReader會一次把所有的數據全部拿回來,當數據量過大而服務器內存不夠時,就會遇到下面無法分配內存的問題:

spring batch使用reader讀數據的內存容量問題詳解

報錯信息為:Resource exhaustion event:The JVM was unable to allocate memory from the heap. 意思就是需要分配內存的數據太多,但是無法找到足夠的內存了。

反映在內存里,堆內存會呈現出如下的情況:

spring batch使用reader讀數據的內存容量問題詳解

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

spring batch使用reader讀數據的內存容量問題詳解

毫無疑問,當我們的數據量大時不應該使用這種類型的reader來讀取數據。

JdbcPagingItemReader

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

@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;}

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

spring batch使用reader讀數據的內存容量問題詳解

spring batch使用reader讀數據的內存容量問題詳解

老年代內存不會有任何變化,年輕帶會隨著服務器數據遷移進行而增大同時被回收。

在使用JdbcPagingItemReader時,有一個必須注意的地方就是排序關鍵字是必須指定的,原因在于排序是分頁實現原理的技術基礎。sortKey和我們指定的其他字句一起構建出SQL語句出來。在sortKey上必須使用unique key constraint約束,因為只有這樣才能得以確保執行之間不會丟失任何數據。這也可以說是JdbcCursorItemReader相對便利的一點優勢。

總結

數據量小時選擇的方案差別不會很大,當數據量大時,為了有好的內存表現則使用分頁的reader是必要的。但同時,因為要實現分頁,也會帶來一些不可避免的限制。

到此這篇關于spring batch使用reader讀數據的內存容量問題詳解的文章就介紹到這了,更多相關spring batch使用reader讀數據內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区三区四区| 精品国产精品久久一区免费式 | 日韩二区三区在线观看| 久久久777| 久久91导航| 日韩av网站免费在线| 中文字幕av一区二区三区人| 日韩黄色免费网站| 欧美亚洲免费| 国产精品tv| 日韩福利视频一区| 欧美天堂在线| 私拍精品福利视频在线一区| 狠狠操综合网| 亚洲午夜国产成人| 亚洲精品日本| 久久99久久久精品欧美| 99精品视频在线| 免费日本视频一区| 欧美日本久久| 欧美亚洲国产日韩| 亚洲精品**中文毛片| 日韩一区精品视频| 在线视频亚洲欧美中文| 国产精品伦一区二区| 91精品1区| 日韩激情啪啪| 成人午夜精品| 亚洲精华国产欧美| 国产精品欧美三级在线观看| 色偷偷色偷偷色偷偷在线视频| 国产精品二区不卡| 伊人久久婷婷| 国产成人精品一区二区免费看京| 亚洲午夜黄色| 男女性色大片免费观看一区二区| 免费精品视频在线| 成人污污视频| 国产精品一级在线观看| 久久久9色精品国产一区二区三区| 亚洲有吗中文字幕| 成人在线超碰| 日韩高清欧美激情| 中文日韩在线| 国产欧美日韩在线一区二区| 99视频精品| 欧美日韩视频| 国产v日韩v欧美v| 日本精品一区二区三区在线观看视频| 久久成人av| 久久午夜精品| 免费高清在线一区| 亚洲91精品| 黑人精品一区| 国产日韩中文在线中文字幕 | 黑丝一区二区| 国产伦理一区| 欧美日韩亚洲一区| 免费精品视频| 国产精品久久观看| 国产欧美亚洲一区| 国产亚洲观看| 国产精品流白浆在线观看| 深夜福利一区| 亚洲精品四区| 亚洲一区二区三区免费在线观看| 91久久国产| 久久国产影院| 激情婷婷亚洲| 亚洲一区不卡| 香蕉久久99| 在线亚洲精品| 欧美一级网址| 国产精品亚洲产品| 精品久久久久中文字幕小说| 在线看片福利| 久久婷婷激情| 中文在线一区| 99国产精品99久久久久久粉嫩| 免费观看在线综合| 欧美精品影院| 久久国产精品免费一区二区三区| 美女久久99| 免费日韩av片| 国产麻豆精品久久| 日本免费一区二区三区四区| 一级欧美视频| 国产伦理一区| 99久久亚洲精品蜜臀| 91成人精品| 日韩av中文在线观看| 精品一区二区三区四区五区| 国产a亚洲精品| 国产一区导航| 欧美丝袜一区| 欧美亚洲tv| 在线日韩中文| 国产一区二区三区免费在线 | 亚洲91视频| 日韩av黄色在线| 狠狠操综合网| 欧美一区二区三区久久精品| 色综合www| 亚洲三级精品| 国产精品美女午夜爽爽| 精品在线91| 福利一区视频| 亚洲一区二区免费看| 日韩三区在线| 国产精品欧美日韩一区| 五月天久久777| 97se综合| 国产一区二区三区四区二区| 不卡在线一区二区| 中文字幕在线看片| 国产一区二区三区不卡av | 国产欧美大片| 欧美综合二区| 免费不卡中文字幕在线| 欧美片第1页综合| 另类激情亚洲| 国产一级一区二区| 欧美日韩一二| 日韩欧美一区二区三区免费观看| 欧美成人aaa| 久久夜色精品| 视频一区二区国产| 午夜欧美精品| 毛片在线网站| 中文字幕在线视频久| аⅴ资源天堂资源库在线| 亚洲另类黄色| 日本亚洲视频在线| 国产欧美日韩一区二区三区四区| 日韩在线播放一区二区| 美女精品网站| 欧美在线看片| 久久精品国内一区二区三区| 美女尤物国产一区| 国产福利91精品一区二区| 日韩成人a**站| 精品亚洲美女网站| 久热精品在线| 日韩一区精品| 国产一区不卡| 久久久久国产| 午夜av不卡| 水野朝阳av一区二区三区| 日韩不卡在线观看日韩不卡视频 | 亚洲成av人片一区二区密柚| 伊人久久大香线蕉av不卡| 免费在线欧美视频| 国产精品videossex| 超碰在线99| 亚洲欧洲专区| 精品国产欧美| 最新国产拍偷乱拍精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩国产在线一| 欧美天堂视频| 欧美日韩18| 欧美日韩一二| 欧美成人aaa| 天堂成人国产精品一区| 日韩美女一区二区三区在线观看| 影音国产精品| 精品视频在线你懂得| 国产一区二区高清| 中文字幕色婷婷在线视频| 日本成人在线视频网站| 亚洲福利久久| 久久一区欧美| 国产偷自视频区视频一区二区| 国产精品成人自拍| 999在线观看精品免费不卡网站| 久久不卡日韩美女| 国产色99精品9i| 国产中文一区| 色婷婷色综合| 日韩高清中文字幕一区| 国产乱子精品一区二区在线观看| 久久视频精品| 亚洲性色av| 欧美激情麻豆| 国产探花一区二区| 国产精品s色| 911精品国产| 首页国产欧美久久| 欧美日韩水蜜桃| 精品国产91| 亚洲人妖在线| 日韩和欧美的一区| 亚洲精品一级| 狠狠爱www人成狠狠爱综合网| 欧美va天堂| 伊人久久亚洲热| 国产亚洲精品v| 久久成人精品| 亚洲精品国模| 久久国产麻豆精品|