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

2022-07-25 12:03:08

開心一刻

  昨晚跟我媽語音

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

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

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

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

  媽:你給我滾

  然後她直接把語音給掛了

  測試方式和之前一樣,給 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 設定項生效的過程還有其他設定項參與了邏輯,而非簡單的直接賦值,大家可以琢磨下為什麼這麼實現