mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别
1. MySQL連接池
連接池通常實現在client端,是指應用(客戶端)預先創建一定的連接,利用這些連接服務于客戶端所有的DB請求。如果某一個時刻,空閑的連接數小于DB的請求數,則需要將請求排隊,等待空閑連接處理。
通過連接池可以復用連接,避免連接的頻繁創建和釋放,從而減少請求的平均響應時間,并且在請求繁忙時,通過請求排隊,可以緩沖應用對DB的沖擊。
常見的MySQL連接池Tomcat、WildFly(JBoss)、 c3p0、 Druid等。
2. MySQL線程緩存
線程緩存實現在server端,client連接對應的線程會被緩存起來,緩存的線程數量由 thread_cache_size大小決定。當服務器不斷有大量連接創建、關閉的場景下,使用線程緩存能夠重用緩存起來的線程,避免了線程大量創建銷毀帶來的性能消耗,但是仍然無法解決高連接數帶來的線程數過高的問題。
線程緩存命中率計算:(1-Threads_created/Connections)
注意:
當線程池功能開啟后,線程緩存會自動失效,即變量thread_cache_size將被忽略,Threads_cached 狀態變量始終為0。
3. MySQL線程池
線程池實現在server端,通過創建一定數量的線程服務DB請求,相對于one-conection-per-thread的一個線程服務一個連接的方式,線程池服務的最小單位是SQL語句,即一個線程可以對應多個活躍的連接。通過線程池,可以將server端的服務線程數控制在一定的范圍,減少了系統資源的競爭和線程創建、銷毀以及上下文切換帶來的消耗,同時也避免出現高連接數導致的高并發問題。
線程池是MySQL 5.6 的開始提供的一個核心功能,MySQL 5.6 之前,處理連接的方式是 one-thread-per-connection, 對于每一個client 連接都會創建一個獨立的線程,請求結束,銷毀線程。高并發下,導致線程的頻繁創建和釋放,以及頻繁的線程上下文切換,降低了資源利用率。通過線程池,一個線程可以處理多個client連接請求,減少線程頻繁創建釋放以及線程上下文切換帶來的性能損耗。
通過參數thread_handling來控制是否使用線程池,thread_handling 取值:
no-threads
one-thread-per-connection(默認值)
loaded-dynamically(大于等于5.7.9版本)
pool-of-threads(Percona版本)
Percona 在MySQL社區版基礎上為 thread_handling 參數增加了pool-of-threads,Percona 的線程池實現在server層,與官方版以plugin形式實現不同,Percona版線程池與官方企業版并不兼容。
總結
以上是生活随笔為你收集整理的mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php删除禁用函数,百度云平台封禁的PH
- 下一篇: matlab如何表示一阶导数,三阶样条插