jdbcTemplate读数据内存溢出

3 篇文章 0 订阅
1 篇文章 0 订阅

最近做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();
        }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值