jdbcTemplate读数据内存溢出
日期: 2018-01-20 分类: 跨站数据 347次阅读
最近做Hadoop项目的自动化测试,代码要从hadoop mart里读数据出来,写到.csv文件里。有一个query结果集包含10万+条记录,且每条记录包含30+个列,于是jdbcTemplate华丽丽的内存溢出了。其实论数据量,这个真心不算大…
仔细看了看代码,大概知道了原因,结果集保存在List<Map<String, Object>>
这种结构中,而Map是比较消耗内存的,10万+个Map,每个Map30+对key-value…内存溢出是可以理解的
public List<Map<String, Object>> querySQL(final String query){
return jdbcTemplate.queryForList(query);
}
于是改用最原始的statement执行query,设置fetch szie,然后将result set存到List<List<String>>
中。每到2000行,就写一次csv并将List<List<String>>
清空,666,跑起来又快又不会溢出!
public void readWriteResultSetTOCsv(String query, String csvPath){
try (Connection con = jdbcTempalte.getDataSource.getConnection();
Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);){
stmt.setFetchSize(5000);
ResultSet rs = stmt.executeQuery(query);
List<List<String>> rows = new ArrayList<>();
List<String> header = getColHeaderFromRS(rs);
while(rs.next()){
List<String> row = new ArrayList<>();
for(String h : header){
row.add(rs.getString(h));
}
rows.add(row);
if(rows.size() > 2000){
//write to csv
rows.clear();
}
}
if(rows.isEmpty()){
//write to csv
}
rs.close();
}
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
精华推荐