Druid 查詢超時配置的探究 → DataSource 和 JdbcTemplate 的 queryTimeout 到底誰生效?

開心一刻

  昨晚跟我媽語音

  媽:我年紀有點大了,想抱孩子了

  我:媽,我都多大了,你還想抱我?

  媽:我想抱小孩,誰樂意抱你呀!

  我:剛好小區有人想找月嫂,要不我幫你聯繫下?

  媽:你給我滾

  然後她直接把語音給掛了

前情回顧

  還記得記一次 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 配置項生效的過程還有其他配置項參與了邏輯,而非簡單的直接賦值,大家可以琢磨下爲什麼這麼實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章