首页 > 其他分享 >Druid 查询超时配置的探究 → DataSource 和 JdbcTemplate 的 queryTimeout 到底谁生效?

Druid 查询超时配置的探究 → DataSource 和 JdbcTemplate 的 queryTimeout 到底谁生效?

时间:2023-05-07 12:15:06浏览次数:37  
标签:queryTimeout 配置 Druid 源码 JdbcTemplate transactionQueryTimeout DataSource

前情回顾

  还记得记一次 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 配置项生效的过程还有其他配置项参与了逻辑,而非简单的直接赋值,大家可以琢磨下为什么这么实现

https://www.cnblogs.com/youzhibing/p/16514819.html

标签:queryTimeout,配置,Druid,源码,JdbcTemplate,transactionQueryTimeout,DataSource
From: https://www.cnblogs.com/chuangsi/p/17379079.html

相关文章

  • Error creating bean with name ‘dataSource‘ defined in class path resource解决
    原因是导入了jdbc的依赖,使用@Configuration注解向spring注入了dataSourcebean。但是因为工程中没有关于dataSource相关的配置信息,当spring创建dataSourcebean因缺少相关的信息就会报错。有两个办法:办法1:去除spring-boot-starter-jdbc的依赖或者mybatis的依赖办法2:在Sprin......
  • Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified
    导入一个新的springbootmaven项目启动一直报这个错,查出来的答案都说是加注解把数据库扫描给排除掉,这种方式其实有点鸵鸟,项目原先是没问题的,现在导入到自己的环境启动不起来,那肯定是不能去改动代码的。排查了一遍,发现是项目中的resources文件没有指定成资源文件,所以找不到数据库......
  • SqlSessionFactory、SqlSession、Druid之间的关系梳理
    SqlSessionFactory是什么?SqlSessionFactory 是Mybatis的核心接口之一,它是用于创建SqlSession对象。Mybatis的SqlSession对象是负责管理应用程序与数据库之间一组事务的机制,并为应用程序提供访问数据库的方法。SqlSession是线程不安全的对象,因此应始终使用它的请求/响......
  • 苞米豆的多数据源 → dynamic-datasource-spring-boot-starter,挺香的!
    开心一刻2023年元旦,我妈又开始了对我的念叨妈:你到底想多少岁结婚我:60妈:60,你想找个多大的我:找个55的啊,她55我60,结婚都有退休金,不用上班不用生孩子,不用买车买房,成天就是玩儿我:而且一结婚就是白头偕老,多好我妈直接一大嘴巴子呼我脸上需求背景......
  • sql2005 OPENDATASOURCE 需要Ad Hoc Distributed Quer
    execsp_configure'showadvancedoptions',1reconfigureexecsp_configure'AdHocDistributedQueries',1reconfigureGOSELECT*FROMOPENDATASOURCE('SQLOLEDB','DataSource=192.168.1.100,1433;UserID=sa;Password=......
  • SpringBoot配置了数据库依赖 报错: Failed to configure a DataSource: 'url' attrib
    错误2023-04-1511:56:16.025INFO12028---[restartedMain]ConditionEvaluationReportLoggingListener:ErrorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug'enabled.2023-04-1511:56:16.060E......
  • nacos 启动DataSource Set解决办法
    通过查看config-fatal.log日志文件发现   报错:com.mysql.cj.exceptions.CJException:PublicKeyRetrievalisnotallowed经调查资料得知,此原因跟mySql版本有关,最核心的原因是mysql8.0.13开始,使用sslMode属性代替了原来的useSSL属性,所以吧useSSL改成sslMode=DISAB......
  • druid yml 参数配置
    spring: datasource: #druid连接池 type:com.alibaba.druid.pool.DruidDataSource #数据库驱动 driver:com.mysql.jdbc.Driver #最大连接池数量 max-active:20 #初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 initial-size:10......
  • SpringBoot @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})注
    @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})该注解的作用是,排除自动注入数据源的配置,用exclude属性进行排除指定的类,在springBoot中使用多数据源时,加上@SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})DataSourceAutoConfigur......
  • SpringBoot之整合Druid数据源
    1.引入依赖<!--jdbc相关的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--druid数据源依赖--><dependency><grou......