本文介紹了Spring Batch JdbcCursorItemReader導致內存不足問題的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在使用Spring Batch框架進行數據遷移。我使用的讀取器是JdbcCursorItemReader。我將塊大小設置為500,并將讀取器獲取大小設置為1000。但是,當使用Spring Batch運行該服務時,它似乎只讀取了內存中的所有數據一次,然后就耗盡了內存。然后拋出內存不足的問題。下面是我對讀者的定義:
private JdbcCursorItemReader<Map<String, Object>> buildItemReader(final DataSource dataSource, String tableName,String tenant) {
String tenantName = tenantHelper.determineTenant(tableName);
JdbcCursorItemReader<Map<String, Object>> itemReader = new JdbcCursorItemReader<>();
itemReader.setDataSource(dataSource);
itemReader.setSql("select * from " + tableName + " where " + tenantName + " ='" + tenant + "'");
itemReader.setRowMapper(new ColumnMapRowMapper());
itemReader.setFetchSize(100);
return itemReader;
}
另外,從Spring Batch文檔here應該可以通過使用jdbcCursorItemReader來避免內存問題
推薦答案
通過使用jdbcPagingItemReader解決了這個問題。游標讀取器消耗大量內存的根本原因是,它只是將所有數據讀入內存,然后進行處理,JVM會將其視為一個大對象,直接分配到老一代中,直到整個過程完成后才能收集。
這篇關于Spring Batch JdbcCursorItemReader導致內存不足問題的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,