Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据

jdbcTemplate读数据内存溢出

最近做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

上一篇: Oracle数据库-备份整个数据库与还原整个数据库数据

下一篇: 微信小程序支付功能 C# .NET开发

精华推荐