MySQL數據庫超時設置配置的方法實例
前言
最近備戰京東雙11,在配置MySQL的超時配置發現有很多地方可以設置。這麼多超時的配置有什麼影響,以及配置會有什麼影響呢?今天的文章就讓我來大傢來分析一下。
1. JDBC超時設置
connectTimeout:表示等待和MySQL數據庫建立socket鏈接的超時時間,默認值0,表示不設置超時,單位毫秒,建議30000
socketTimeout:表示客戶端和MySQL數據庫建立socket後,讀寫socket時的等待的超時時間,linux系統默認的socketTimeout為30分鐘,可以不設置
2. 連接池超時設置
maxWait:表示從數據庫連接池取鏈接,連接池沒有可用連接時的等待時間,默認值0,表示無限等待,單位毫秒,建議60000
3. MyBatis查詢超時
defaultStatementTimeout:表示在MyBatis配置文件中默認查詢超時間,單位秒,不設置則無線等待
如果一些sql需要執行超過defaultStatementTimeout可以通過Mapper文件單獨的sql的timeout進行配置
4. 事務超時
事務超時用於控制事務執行的超時,執行時間是事務內所有代碼執行總和,單位為秒。
總結
高級別的timeout依賴於低級別的timeout,隻有當低級別的timeout無誤時,高級別的timeout才能確保正常。例如,當socket timeout出現問題時,高級別的statement timeout和transaction timeout都將失效。
1. Transaction Timeout
Spring提供的transaction timeout配置非常簡單,它會記錄每個事務的開始時間和消耗時間,當特定的事件發生時就會對消耗時間做校驗,當超出timeout值時將拋出異常。
假設某個事務中包含5個statement,每個statement的執行時間是200ms,其他業務邏輯的執行時間是100ms,那麼transaction timeout至少應該設置為1,100ms(200 * 5 + 100)。
2. Statement Timeout
statement timeout用來限制statement的執行時長,timeout的值通過調用JDBC的java.sql.Statement.setQueryTimeout(int timeout) API進行設置。不過現在開發者已經很少直接在代碼中設置,而多是通過框架來進行設置。
在iBatis中,statement timeout的默認值可以通過sql-map-config.xml中的defaultStatementTimeout 屬性進行設置。同時,你還可以設置sqlmap中select,insert,update標簽的timeout屬性,從而對不同sql語句的超時時間進行獨立的配置。
3. Socket timeout
JDBC的socket timeout在數據庫被突然停掉或是發生網絡錯誤(由於設備故障等原因)時十分重要。由於TCP/IP的結構原因,socket沒有辦法探測到網絡錯誤,因此應用也無法主動發現數據庫連接斷開。如果沒有設置socket timeout的話,應用在數據庫返回結果前會無期限地等下去,這種連接被稱為dead connection。
為瞭避免dead connections,socket必須要有超時配置。socket timeout可以通過JDBC設置,socket timeout能夠避免應用在發生網絡錯誤時產生無休止等待的情況,縮短服務失效的時間。
不推薦使用socket timeout來限制statement的執行時長,因此socket timeout的值必須要高於statement timeout,否則,socket timeout將會先生效,這樣statement timeout就變得毫無意義,也無法生效。
到此這篇關於MySQL數據庫超時設置配置的文章就介紹到這瞭,更多相關MySQL數據庫超時設置配置內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Mybatis控制臺打印SQL語句的兩種方式實現
- 一篇文章帶你學習JAVA MyBatis底層原理
- Java面試題沖刺第九天–MyBatis2
- idea中springboot項目連接數據庫報錯的原因解析
- MyBatis別名和settings設置方式