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

來源:互聯網
上載者:User

標籤:

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.