mysql jdbc查询慢 spring_使用spring jdbc遇到的一个性能问题
使用JdbcTemplate的queryForList方法,返回特别慢,40多万结果集耗时超过6分钟。双核CPU,占用率始终在50%,内存逐渐增长至2G左右。进行debug跟进去看,看到jdbcTemplate调用jdbc返回ResultSet只用了30秒左右,之后就一直耗在extractData方法里。该方法是用默认的RowMapper,先取得MetaData然后根据这个去生成Map。对比方法:
使用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效率也会提升到相似水平。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)