Druid 查询超时配置的探究 → DataSource 和 JdbcTemplate 的 queryTimeout ...

打印 上一主题 下一主题

主题 875|帖子 875|积分 2625

开心一刻

  昨晚跟我妈语音
  妈:我年纪有点大了,想抱孩子了
  我:妈,我都多大了,你还想抱我?
  妈:我想抱小孩,谁乐意抱你呀!
  我:刚好小区有人想找月嫂,要不我帮你联系下?
  妈:你给我滚
  然后她直接把语音给挂了

前情回顾

  还记得记一次 Druid 超时配置的问题 → 引发对 Druid 时间配置项的探究遗留的问题吗?
  如果同时设置 DataSource 的 queryTimeout 和 JdbcTemplate 的 queryTimeout ,那么哪个 queryTimeout 生效?
实践出结果

  想快速知道答案,做法很简单,两个都设置,看生效的是哪个
  示例代码:druid-timeout
  我们在原来的基础上改一下:加上这两个配置项,用单线程测试就行了

  测试方式和之前一样,给 tbl_user 表加写锁

  我们来看下花费时长

  结果很明了: JdbcTemplate 的 queryTimeout 生效
源码寻真相

  想知道为什么,跟源码呗

  我们重点看

  通过方法名我们大致能猜到其作用,我们具体看 queryTimeout 相关的内容
  con.createStatement()

  大家仔细看,别跟丢了哦

  可以看到看到此时 stmt.setQueryTimeout(queryTimeout) 设置的是 DataSource 的 queryTimeout ,也就是 7 秒
  这里有个细节值得大家留意下

  不是简单的将 DataSource 的 queryTimeout 赋值给 Statement 
  有兴趣的可以去看看 DataSource 的 transactionQueryTimeout 和 defaultAutoCommit 的相关源码,这里就不跟了
  applyStatementSettings(stmt)


  可以看到,又重置成 JdbcTemplate 的 queryTimeout 了
  至此,相信大家已经明了了
补充留疑问

  假设配置了 queryTimeout ,思考如下三种情况
  1、如果配置 transactionQueryTimeout 
  2、如果配置了 defaultAutoCommit 会出现什么情况
  3、如果同时配置了 transactionQueryTimeout 和 defaultAutoCommit ,又会出现什么情况
总结

  关于 queryTimeout ,相信大家已经清楚了(未考虑 transactionQueryTimeout )

  从源码可以看出, queryTimeout 配置项生效的过程还有其他配置项参与了逻辑,而非简单的直接赋值,大家可以琢磨下为什么这么实现

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表