'mysql開發理論:搞懂什麼是長連接,短連接和連接池'

MySQL SQL 數據庫 PHP 技術 Java 設計 程序不就是0和1 2019-08-04
"

回憶前篇文章我們已經知道給mysql創建用戶時候,需要創建用戶名和允許連接服務器的主機,這就說明了我們登錄數據庫不一定是本地連接,還包括遠程連接,那麼當遠程連接時候,那麼就需要建立網絡來進行數據通訊。所以本節討論下長連接、短連接和連接池的概念。

傳送門:mysql運維管理(二):創建普通用戶並登錄數據庫


"

回憶前篇文章我們已經知道給mysql創建用戶時候,需要創建用戶名和允許連接服務器的主機,這就說明了我們登錄數據庫不一定是本地連接,還包括遠程連接,那麼當遠程連接時候,那麼就需要建立網絡來進行數據通訊。所以本節討論下長連接、短連接和連接池的概念。

傳送門:mysql運維管理(二):創建普通用戶並登錄數據庫


mysql開發理論:搞懂什麼是長連接,短連接和連接池



短連接

短連接就是我們開發的應用程序需要訪問數據庫時候,需要建立數據連接,執行SQL操作,關閉連接,用java中的偽代碼來描述一下這個過程:

conn = session.onpenConnection();
conn.execute('SQL命令');
session.close();

簡單講就是每一次操作數據庫,都要執行一次上述操作。它的弊端就是:如果網絡速度不是很理想的情況下,短連接的會消耗大量的系統資源,在生產環境中,業務很多的話,可能1秒內幾千個連接,如果都是短連接,且sql處理慢的話,連接關閉不及時,那麼資源耗盡速度可能發生在幾分鐘甚至幾秒,所以我們系統不大可能一直是短連接。


"

回憶前篇文章我們已經知道給mysql創建用戶時候,需要創建用戶名和允許連接服務器的主機,這就說明了我們登錄數據庫不一定是本地連接,還包括遠程連接,那麼當遠程連接時候,那麼就需要建立網絡來進行數據通訊。所以本節討論下長連接、短連接和連接池的概念。

傳送門:mysql運維管理(二):創建普通用戶並登錄數據庫


mysql開發理論:搞懂什麼是長連接,短連接和連接池



短連接

短連接就是我們開發的應用程序需要訪問數據庫時候,需要建立數據連接,執行SQL操作,關閉連接,用java中的偽代碼來描述一下這個過程:

conn = session.onpenConnection();
conn.execute('SQL命令');
session.close();

簡單講就是每一次操作數據庫,都要執行一次上述操作。它的弊端就是:如果網絡速度不是很理想的情況下,短連接的會消耗大量的系統資源,在生產環境中,業務很多的話,可能1秒內幾千個連接,如果都是短連接,且sql處理慢的話,連接關閉不及時,那麼資源耗盡速度可能發生在幾分鐘甚至幾秒,所以我們系統不大可能一直是短連接。


mysql開發理論:搞懂什麼是長連接,短連接和連接池


長連接

長連接是指我們的程序和數據庫連接之後,就一直打開,後面程序來訪問相同數據庫就複用該連接,使用長連接主要是考慮到減少短連接連接的開銷。有資料顯示Mysql的連接比其他數據庫要快。

目前PHP程序連接數據庫是默認採用長連接模式,當它要建立連接來訪問數據庫時候,PHP會檢查是否有相同的連接,存在的話就複用該連接,不存在就新建一個長連接。怎麼認為是相同連接呢,其實很簡單,只要用戶名密碼相同,且連接同一個IP的主機數據庫,就認為相同。從程序來講,作為客戶端,使用長連接可以不用每次都創建連接對象,如果業務很繁忙的話,使用長連接時候,程序性能會很高效。但是PHP長連接也會導致數據庫連接超過閒置,或者內存耗盡的問題。需要合理的設計和優化。

但是從服務器端來看,維持一個連接會佔用服務器內存,如果所有程序都是長連接,肯定會有部分連接處於閒置狀態,但是無論什麼狀態連接,都佔用內存,這會造成服務器端的資源浪費,也顯得不是很高效。

對於擴展性好的系統,往往大部分訪問不需要連接數據庫,它們會採用緩存的方式來避免頻繁連接數據庫。

"

回憶前篇文章我們已經知道給mysql創建用戶時候,需要創建用戶名和允許連接服務器的主機,這就說明了我們登錄數據庫不一定是本地連接,還包括遠程連接,那麼當遠程連接時候,那麼就需要建立網絡來進行數據通訊。所以本節討論下長連接、短連接和連接池的概念。

傳送門:mysql運維管理(二):創建普通用戶並登錄數據庫


mysql開發理論:搞懂什麼是長連接,短連接和連接池



短連接

短連接就是我們開發的應用程序需要訪問數據庫時候,需要建立數據連接,執行SQL操作,關閉連接,用java中的偽代碼來描述一下這個過程:

conn = session.onpenConnection();
conn.execute('SQL命令');
session.close();

簡單講就是每一次操作數據庫,都要執行一次上述操作。它的弊端就是:如果網絡速度不是很理想的情況下,短連接的會消耗大量的系統資源,在生產環境中,業務很多的話,可能1秒內幾千個連接,如果都是短連接,且sql處理慢的話,連接關閉不及時,那麼資源耗盡速度可能發生在幾分鐘甚至幾秒,所以我們系統不大可能一直是短連接。


mysql開發理論:搞懂什麼是長連接,短連接和連接池


長連接

長連接是指我們的程序和數據庫連接之後,就一直打開,後面程序來訪問相同數據庫就複用該連接,使用長連接主要是考慮到減少短連接連接的開銷。有資料顯示Mysql的連接比其他數據庫要快。

目前PHP程序連接數據庫是默認採用長連接模式,當它要建立連接來訪問數據庫時候,PHP會檢查是否有相同的連接,存在的話就複用該連接,不存在就新建一個長連接。怎麼認為是相同連接呢,其實很簡單,只要用戶名密碼相同,且連接同一個IP的主機數據庫,就認為相同。從程序來講,作為客戶端,使用長連接可以不用每次都創建連接對象,如果業務很繁忙的話,使用長連接時候,程序性能會很高效。但是PHP長連接也會導致數據庫連接超過閒置,或者內存耗盡的問題。需要合理的設計和優化。

但是從服務器端來看,維持一個連接會佔用服務器內存,如果所有程序都是長連接,肯定會有部分連接處於閒置狀態,但是無論什麼狀態連接,都佔用內存,這會造成服務器端的資源浪費,也顯得不是很高效。

對於擴展性好的系統,往往大部分訪問不需要連接數據庫,它們會採用緩存的方式來避免頻繁連接數據庫。

mysql開發理論:搞懂什麼是長連接,短連接和連接池

連接池

正是因為無論長連接和短連接都有一些弊端,造成創建連接或者維護連接開銷導致所耗資源過多,此時需要增加連接池來改進性能。它是一個預先創建的連接緩衝池,考慮到某些數據進行連接之後,處理時間過長,而不想它閒置,允許給其他線程使用。一般現在的應用服務器都帶有連接池組件,允許應用程序,客戶端來連接,應用服務器維護著連接池的整個生命週期。

數據庫連接池技術的思想非常簡單,將數據庫連接作為對象存儲在一個Vector對象中,一旦數據庫連接建立後,不同的數據庫訪問請求就可以共享這些連接,這樣,通過複用這些已經建立的數據庫連接,可以克服無論長連接和短連接缺點,極大地節省系統資源和時間。

寫在最後

在與數據庫有關的應用開發中,數據庫連接的管理是一個難點。所以我們要不斷的優化連接池的參數配置,配合性能壓測,達到一個理想的性能指標值。

如果本文對你有用,請加關注,後續會有更多的運維開發經驗。

"

相關推薦

推薦中...