使用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>的过程不超过10s。
2. 改用jdbcTemplate的public List query(String sql, RowMapper rowMapper)方法,T填入Map,这样就跟queryForList方法返回值一样了,然后自己实现RowMapper,直接用Map的put方法填充数据。实验结果跟直接用纯jdbc效率相同。
3. 使用纯jdbc,自己写一个实体类,把resultSet里的数据循环填入对象放到List里。耗时40多秒,最后内存1.5G。说明还是会省一点内存的。但是性能提升有限。
结论:
目前建议结果集较大时,最好使用public List query(String sql, RowMapper rowMapper)方法替代qeuryForList方法,这样效率会有所提高。
未来估计jdbcTemplate的queryForList效率也会提升到相似水平。