通过setFetchSize解决jdbc查询性能问题,附面试答案

问题回顾

====================================================================

问题是这样的,这两天有个项目一直在实施阶段,然后项目上就反馈说,啊,你们东西怎么这么慢啊,这才刚开始啊…然后我就开始了排查:

  1. 通过logger记录的日志的各个阶段的耗时来看,目前性能瓶颈主要体现在JdbcTemplate.query上了

  2. 常规手段,先确认物理表中的数据量+查询语句+查询数据量+索引

  3. 确认了一圈,物理表里一共1.4W条记录,本次查询8200多条记录,一共耗时2.5秒左右

  4. 这就很离谱了,因为我们是内网环境重现问题,网络IO按说基本没啥消耗,然后我用sqldeveloper执行了一下,查询结果返回的非常快,加载全部数据大约耗时300~600毫秒

  5. 这就更离谱了…why?

  6. debug分析时发现,单次调用rs.next,依然非常快,几乎感觉不到任何卡顿,所以感觉上sql执行的效率应该还可以,问题应该不在这里

  7. 分析到这里时,几乎陷入了瓶颈,然后,我就想到了IO模型

  8. 我感觉自己忽略了网络IO的问题,查询结果有8K条记录,这8K条记录应该不是一次性直接返回给客户端的

  9. 如果是直接返回的话,那么我在第一次调用rs.next的时候,应该会感觉到卡顿的

  10. 但是应该也不是每次调用都会触发网络请求,如果是每次rs.next都触发网络请求,按感觉网络IO会爆表,jdbc应该不会这么设计的

  11. 那么,一定有一个参数可以设置每次从服务端读取多少数据到客户端

  12. 然后,我就发现了setFetchSize这个属性,在我的这个业务场景下,设置了setFetchSize(1000),rs.next的耗时从2.5秒缩短到140~500毫秒

原理探究

====================================================================

接下来我们探究一下setFetchSize究竟干了什么,首先我们看下Java doc

Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for this ResultSet object. If the fetch size specified is zero, the JDBC driver ignores the value and is free to make its own best guess as to what the fetch size should be. The default value is set by the Statement object that created the result set. The fetch size may be changed at any time.

大概意思是说:这个属性会提示jdbc每次从数据库服务拉取结果的行数

关于这个字段的默认值: 网上有很多说法,有的说是0,也有的说是10,我翻了一下ojdbc8的源码,至少在oracle的驱动中,这个参数的默认值是10

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中…(img-3QkLg8Tl-1712769262709)]

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值