使用spring jdbc遇到的一个性能问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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效率也会提升到相似水平。

以上是关于使用spring jdbc遇到的一个性能问题的主要内容,如果未能解决你的问题,请参考以下文章

性能测试工程师,面试都问什么?

spring+ehcache实战--性能优化之道

使用 spring Jpa 提高休眠性能

面试遇到一个人才,我问怎么调优,他说有手就行。。。

面试遇到一个人才,我问怎么调优,他说有手就行。。。

性能测试:性能测试岗位常见面试题