我是靠谱客的博主 独特板栗,最近开发中收集的这篇文章主要介绍使用spring jdbcTemplate 批量查询校验【支持50万数据】使用JDBC不会造成内存溢出,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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();  
                }  
            }  
    } 

最后

以上就是独特板栗为你收集整理的使用spring jdbcTemplate 批量查询校验【支持50万数据】使用JDBC不会造成内存溢出的全部内容,希望文章能够帮你解决使用spring jdbcTemplate 批量查询校验【支持50万数据】使用JDBC不会造成内存溢出所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部