1

私が今抱えている問題は、によって呼び出されたストアド プロシージャがjdbcTemplate大量のレコード、つまり数百万のレコードを返すため、Java クエリ メソッドが非常に遅くなることです。

私の 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);
    }
}
4

1 に答える 1

1

DB ストアド プロシージャを変更せずにこれを改善するにはどうすればよいですか。

あなたの場合、SPを変更するだけで解決策はありません

于 2013-01-23T09:27:07.590 に答える