使用spring jdbc遇到的一個性能問題


使用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效率也會提升到相似水平。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM