2013-01-23 54 views
1

问题我现在有被jdbcTemplate调用的存储过程返回大量记录,百万条记录,这使得我们的java查询方法非常缓慢。使用jdbcTemplate处理大型结果集

我的java查询方法执行结果分页,所以它非常缓慢。如何在不更改DB存储过程的情况下改进此功能。也就是说,只查询特定的行,这样java方法就不会有处理百万条记录的负担来做分页。

public PageModel<Map<String, String>> query(String sql, final int offset, final int limit) throws ReportException { 
    try { 
     return jdbcTemplate.query(sql, new ResultSetExtractor<PageModel<Map<String, String>>>() { 
      @Override 
      public PageModel<Map<String, String>> extractData(ResultSet rs) 
        throws SQLException, DataAccessException { 
       long startTime = System.nanoTime(); 
       PageModel<Map<String, String>> pageModel = new PageModel<Map<String,String>>(); 
       List<Map<String, String>> list = new ArrayList<Map<String,String>>(); 
       int rows = 0; 
       // skip rows 
       for (int i=0; i<offset&&rs.next(); i++) { 
        rows++; 
       } 
       // get rows 
       for (int i=0; i<limit&&rs.next(); i++) { 
        Map<String, String> map = new HashMap<String, String>(); 
        ResultSetMetaData metadata = rs.getMetaData(); 
        int count = metadata.getColumnCount(); 
        for (int j=1; j<=count; j++) { 
         map.put(metadata.getColumnName(j), rs.getString(j)); 
        } 
        list.add(map); 
        rows++; 
       } 
       // iterate remaining rows to get total rows 
       while (rs.next()) 
        rows++; 
       pageModel.setOffset(offset); 
       pageModel.setLimit(limit); 
       pageModel.setData(list); 
       pageModel.setTotal(rows); 
       long endTime = System.nanoTime(); 
       long duration = endTime - startTime; 
       System.out.println("Query took: " + duration); 
       return pageModel; 
      } 
     }); 
    } catch (DataAccessException e) { 
     throw new ReportException(e); 
    } 
} 
+0

为什么你需要查询的记录一百万在一个回合? – 2013-01-23 09:30:14

回答

1

我怎样才能改善这种不改变数据库的存储过程。

没有任何解决方案的情况下,只有改变SP

+0

我同意,每次返回数百行都意味着设计出现问题。 –

+0

所以你的意思是不可能使用jdbcTemplate来限制db的查询结果?我的意思是像jdbc驱动程序默默删除不需要的行,因此它不落入Java代码? – xybrek