1. 程式人生 > >Mysql各種超時時間理解

Mysql各種超時時間理解

       筆者最近做一個專案被mysql驅動包的的超時設定給坑了,起因就是因為沒設定好connection timeout 和socket timeout,導致執行緒全部阻塞等待,機器執行緒全掛起,也無法處理新的其它請求,所以做了下面一些總結。

1、常見超時

  • transaction timeout

      設定的是一個事務的執行時間,裡頭可能包含多個statement,statement timeout(也相當於result set fetch timeout)設定的是一個statement的執行超時時間,即driver等待statement執行完成,接收到資料的超時時間(注意statement的timeout不是整個查詢的timeout,只是statement執行完成並拉取fetchSize資料返回的超時,之後resultSet的next在必要的時候還會觸發fetch資料,每次fetch的超時時間是單獨算的,預設也是以statement設定的timeout為準)

  • jdbc socket timeout

       設定的是jdbc I/O socket read and write operations的超時時間,防止因網路問題或資料庫問題,導致driver一直阻塞等待。(建議比statement timeout的時間長),預設為0,即永遠等待,所以這個引數一定要設定不為0!

  • connection timeout

      建立socket連線的超時時間,單位為ms。在獲取連結時,等待握手的超時時間,只在登入時有效,登入成功這個引數就不管事了。主要是為了防止網路不佳時應用重連導致連線數漲太快,預設為0,即永遠等待,所以這個引數一定要設定不為0!

  • os socket timeout

       這個是作業系統級別的socket設定(如果jdbc socket timeout沒有設定,而os級別的socket timeout有設定,則使用系統的socket timeout值)。

上面的不同級別的timeout越往下優先順序越高,也就是說如果下面的配置比上面的配置值小的話,則會優先觸發timeout,那麼相當於上面的配置值就"失效"了。

2、FAQ 
Q1. 我已經使用Statement.setQueryTimeout()方法設定了查詢超時,但在網路出錯時並沒有產生作用。 

      查詢超時僅在socket timeout生效的前提下才有效,它並不能用來解決外部的網路錯誤,要解決這種問題,必須設定JDBC的socket timeout。 

Q2. transaction timeout,statement timeout和socket timeout和DBCP的配置有什麼關係? 

       當通過DBCP獲取資料庫連線時,除了DBCP獲取連線時的waitTimeout配置以外,其他配置對JDBC沒有什麼影響。 

Q3. 如果設定了JDBC的socket timeout,那DBCP連線池中處於IDLE狀態的連線是否也會在達到超時時間後被關閉? 

       不會。socket的設定只會在產生資料讀寫時生效,而不會對DBCP中的IDLE連線產生影響。當DBCP中發生新連線建立,老的IDLE連線被移除,或是連線有效性校驗的時候,socket設定會對其產生一定的影響,但除非發生網路問題,否則影響很小。 

Q4. socket timeout應該設定為多少? 

        就像我在正文中提的那樣,socket timeout必須高於statement timeout,但並沒有什麼推薦值。在發生網路錯誤的時候,socket timeout將會生效,但是再小心的配置也無法避免網路錯誤的發生,只是在網路錯誤發生後縮短服務失效的時間(如果網路恢復正常的話)。