對於數據庫的疑問

1.題記

   近日將一個網站部署到服務器上,在訪問的過程中,通過linux終端發現,總會有too many connections的錯誤。爲了解決這個錯誤,從幾天前至今,除了兩種解決方法,期間涉及到的很多東西,都不理解,估記於此,與給位共同探討。

 2.問題正文

  網站有個功能,每個半個小時發郵件。測試的發郵件對象有7個。在tomcat剛啓動的那會兒,還可以每隔半個半個小時發送郵件給指定的對象。但是,隨着時間的推移,不好意思,該功能就不能實現了,每個1個小時,或更長的時間,給7個人中的幾個發郵件。手動執行發郵件的job任務,服務器終端便報too many connections錯誤。而且此時,在本機上通過,Nactive for sql連接服務器上的數據庫時,報too many connections 錯誤。

  面對這種情況,我們的一個猜測是,用完連接後沒有將連接釋放。

  數據庫會有一個最大的連接上限,用max_connections參數來表示。當超過這個連接上線,數據庫就不會接受連接,報too many connectios的錯誤。數據庫連接池首先會在池子裏放一定數量的數據庫連接,給應用程序使用。這個數量在spring 的配置文件中可以設定。此外spring中還可以設定最大的連接數。當併發的數據庫訪問數量超過最大的連接數時,後面的數據庫請求就會處於等待狀態。直到某個數據庫連接被釋放,應用程序獲得該請求。上面講的是數據庫連接池的工作原理。

  這個可以解釋等待的現象,併發訪問數據庫達到了設置的最大值。但是too many connections怎麼解釋呢?


 做個這樣一個實驗:數據庫max_conncections=500   數據庫連接池的最小連接數爲20,初始化連接數爲30,最大連接數爲50,如果一個數據庫連接就表示一個Thread_connected的話,那麼Thread_connected最大也就是50 ,但是show processlist顯示Thread_connected超過了400,而且還在不斷遞增,too many connections是時間的問題而已,即使將wait_timeout 設爲100也只能拖延其達到上限的時間。

這到底是怎麼回事??數據庫連接池中這些參數的設定在這個事實面前怎麼覺得毫無意義,Thread_connections中的Thread又到底是什麼含義,和數據庫連接池中的一個連接有什麼關係?是不是數據庫連接池中的一個連接被使用或創建然後被使用代表一個Thread,連接被丟棄後,代表該線程消失了?是的話,Thread_connections的最大線程就只有50,不是的話,那數據庫連接池中這個最大連接、最小連接設定的意義是什麼??

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