使用JdbcTemplate的queryForList方法,返回特別慢,40多萬結果集耗時超過6分鍾。雙核CPU,占用率始終在50%,內存逐漸增長至2G左右。
進行debug跟進去看,看到jdbcTemplate調用jdbc返回ResultSet只用了30秒左右,之后就一直耗在extractData方法里。該方法是用默認的RowMapper,先取得MetaData然后根據這個去生成Map。
對比方法:
1. 使用純jdbc對比,手工碼代碼,直接調用Map的put方法逐個生成Map並填充數據。同樣的sql,耗時40多秒,最后內存2G,其中根據ResultSet生成List<Map<String, Object>>的過程不超過10s。
2. 改用jdbcTemplate的public <T> List<T> query(String sql, RowMapper<T> rowMapper)方法,T填入Map<String, Object>,這樣就跟queryForList方法返回值一樣了,然后自己實現RowMapper,直接用Map的put方法填充數據。實驗結果跟直接用純jdbc效率相同。
3. 使用純jdbc,自己寫一個實體類,把resultSet里的數據循環填入對象放到List里。耗時40多秒,最后內存1.5G。說明還是會省一點內存的。但是性能提升有限。
結論:
目前建議結果集較大時,最好使用public <T> List<T> query(String sql, RowMapper<T> rowMapper)方法替代qeuryForList方法,這樣效率會有所提高。
未來估計jdbcTemplate的queryForList效率也會提升到相似水平。