使用spring jdbcTemplate 批量查询校验【支持50万数据】使用JDBC不会造成内存溢出
来源:互联网 发布:卡乐光电 led 软件 编辑:程序博客网 时间:2024/06/12 00:52
JDBC连接mysql,查大数据集报:java.lang.OutOfMemoryError: Java heap space
http://blog.csdn.net/hwwn2009/article/details/42423039
1.使用spring jdbcTemplate做批量校验 (支持50万数据)
public void mxCheck(String tableName,Map<String,String> checkMap) { String sql="SELECT * from "+ConstKey.SCHEMA_RPT.trim()+"." + tableName+" where 1=1"; final Map<String,String> map = checkMap; jdbcTemplate.query(sql, new ResultSetExtractor<List>() { @Override public List extractData(ResultSet rs) throws SQLException, DataAccessException { List result = new ArrayList(); ResultSetMetaData md = rs.getMetaData(); //获得结果集结构信息,元数据 int columnCount = md.getColumnCount(); //获得列数 List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); Date checkStart = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); System.out.println("明细校验开始时间:"+dateFormat.format(checkStart)); logger.info("明细校验开始时间:"+dateFormat.format(checkStart)); while(rs.next()) { Map<String,Object> rowData = new HashMap<String,Object>();//一行记录 for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); if(rs.getRow()%ConstKey.checkNum == 0 || rs.isLast()){ checkData.singleCheckData(list,map); list.clear(); } } Date checkEnd = new Date(); SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); System.out.println("明细校验结束时间:"+dateFormat2.format(checkEnd)); logger.info("明细校验结束时间:"+dateFormat2.format(checkEnd)); return result; }}); }
1.使用JDBC原生做批量校验 (不会有内存溢出)
public void mxCheckJDBC(String tableName,Map<String,String> checkMap) { String sql="SELECT * from "+ConstKey.SCHEMA_RPT.trim()+"." + tableName+" where 1=1"; long checkNum = getCheckNum(tableName); DataSource dataSource = jdbcTemplate.getDataSource(); Connection con = null; PreparedStatement ps = null; ResultSet rs = null; long count =0; try{ con = dataSource.getConnection(); ps = (PreparedStatement) con.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); ps.setFetchSize(Integer.MIN_VALUE); ps.setFetchDirection(ResultSet.FETCH_REVERSE); rs = ps.executeQuery(); ResultSetMetaData md = rs.getMetaData(); //获得结果集结构信息,元数据 int columnCount = md.getColumnCount(); //获得列数 List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); Date checkStart = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); System.out.println("明细校验开始时间:"+dateFormat.format(checkStart)); logger.info("明细校验开始时间:"+dateFormat.format(checkStart)); while(rs.next()) { Map<String,Object> rowData = new HashMap<String,Object>();//一行记录 for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); count++; if(count%ConstKey.checkNum == 0 || count == checkNum){ checkData.singleCheckData(list,checkMap); list.clear(); } } Date checkEnd = new Date(); SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); System.out.println("明细校验结束时间:"+dateFormat2.format(checkEnd)); logger.info("明细校验结束时间:"+dateFormat2.format(checkEnd)); }catch(Exception e){ logger.info("批量校验异常:"+e.getMessage()); } finally { try { if(rs!=null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(ps!=null){ ps.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(con!=null){ con.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
0 0
- 使用spring jdbcTemplate 批量查询校验【支持50万数据】使用JDBC不会造成内存溢出
- Spring中支持JDBC的JdbcTemplate模板类的使用
- Spring-jdbc:使用支持具名参数的JdbcTemplate
- Spring JDBC学习笔记(1):查询数据库数据之JdbcTemplate的使用
- Spring 使用JdbcTemplate类实现批量查询(RowMapper)
- Spring 使用 JdbcTemplate 批量操作
- Spring-jdbc:JdbcTemplate使用简介
- 使用Spring JDBC批量更改数据
- spring JdbcTemplate 查询,使用BeanPropertyRowMapper
- SQL2008使用CTE递归查询批量插入500万数据
- jdbc查询超大数据集内存溢出
- spring 使用不当会造成存溢出
- spring中的jdbc访问类JdbcTemplate使用
- 使用 Spring jdbcTemplate 进一步简化 JDBC 操作
- JDBC:Spring框架中JDBCTemplate的使用
- 使用Spring的jdbcTemplate简化JDBC操作
- 使用Spring的JdbcTemplate简化jdbc操作
- 使用Spring JDBCTemplate简化JDBC操作
- java 排序算法实现
- 链表的前插法建立与后插法建立
- 学习计划
- 又见Bug
- JS 导出Table为excel
- 使用spring jdbcTemplate 批量查询校验【支持50万数据】使用JDBC不会造成内存溢出
- SpringBoot之Mybatis连接MySQL进行CRUD(注解&配置文件)(简测试版)
- left join on 和 where
- GD32 USART 高级编程 让你的串口不在阻塞发送
- linux压缩命令
- USACO 2.3
- 老司机教你如何正确地在大陆安装 BlackArch
- PHP常用类函数(3)时间格式转换
- vlc精简之编译选项