數(shù)據庫連接池(Connection pooling)是程序啟動時建立足夠的數(shù)據庫連接,并將這些連接組成一個連接池,由程序動態(tài)地對池中的連接進行申請,使用,釋放。
創(chuàng)新互聯(lián)是一家專注于網站設計制作、成都網站制作與策劃設計,張北網站建設哪家好?創(chuàng)新互聯(lián)做網站,專注于網站建設十多年,網設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:張北等地區(qū)。張北做網站價格咨詢:18980820575
簡單的說:創(chuàng)建數(shù)據庫連接是一個很耗時的操作,也容易對數(shù)據庫造成安全隱患。所以,在程序初始化的時候,集中創(chuàng)建多個數(shù)據庫連接,并把他們集中管理,供程序使用,可以保證較快的數(shù)據庫讀寫速度,還更加安全可靠。
不使用數(shù)據庫連接池
如果不使用數(shù)據庫連接池,對于每一次SQL操作,都要走一遍下面完整的流程:
1.TCP建立連接的三次握手(客戶端與 MySQL服務器的連接基于TCP協(xié)議)
2.MySQL認證的三次我收
3.真正的SQL執(zhí)行
4.MySQL的關閉
5.TCP的四次握手關閉
可以看出來,為了執(zhí)行一條SQL,需要進行大量的初始化與關閉操作
使用數(shù)據庫連接池
如果使用數(shù)據庫連接池,那么會 事先申請(初始化)好 相關的數(shù)據庫連接,然后在之后的SQL操作中會復用這些數(shù)據庫連接,操作結束之后數(shù)據庫也不會斷開連接,而是將數(shù)據庫對象放回到數(shù)據庫連接池中
資源重用:由于數(shù)據庫連接得到重用,避免了頻繁的創(chuàng)建、釋放連接引起的性能開銷,在減少系統(tǒng)消耗的基礎上,另一方面也增進了系統(tǒng)運行環(huán)境的平穩(wěn)性(減少內存碎片以及數(shù)據庫臨時進程/線程的數(shù)量)。
更快的系統(tǒng)響應速度:數(shù)據庫連接池在初始化過程中,往往已經創(chuàng)建了若干數(shù)據庫連接置于池中備用。 此時連接的初始化工作均已完成。對于業(yè)務請求處理而言,直接利用現(xiàn)有可用連接,避免了從數(shù)據庫連接初始化和釋放過程的開銷,從而縮減了系統(tǒng)整體響應時間。
統(tǒng)一的連接管理,避免數(shù)據庫連接泄露:在較為完備的數(shù)據庫連接池實現(xiàn)中,可根據預先的連接占用超時設定,強制收回被占用連接。從而避免了常規(guī)數(shù)據庫連接操作中可能出現(xiàn)的資源泄露。
如果說你的服務器CPU是4核i7的,連接池大小應該為((4*2)+1)=9
相關視頻推薦
90分鐘搞懂數(shù)據庫連接池技術|linux后臺開發(fā)
《tcp/ip詳解卷一》: 150行代碼拉開協(xié)議棧實現(xiàn)的篇章
學習地址:C/C++Linux服務器開發(fā)/后臺架構師【零聲教育】-學習視頻教程-騰訊課堂
需要C/C++ Linux服務器架構師學習資料加qun 812855908 獲取(資料包括 C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg 等),免費分享
源碼下載
下載方式:(Github中下載)
db_pool目錄下有兩個目錄,mysql_pool目錄為MySQL連接池代碼,redis_pool為redis連接池代碼
下面介紹mysql_pool
CDBConn解析
概念: 代表一個數(shù)據連接對象實例
相關成員:
m_pDBPool:該數(shù)據庫連接對象所屬的數(shù)據庫連接池
構造函數(shù): 綁定自己所屬于哪個數(shù)據庫連接池
Init()函數(shù): 創(chuàng)建數(shù)據庫連接句柄
CDBPool解析
概念:代表一個數(shù)據庫連接池
相關成員:
Init()函數(shù):常見指定數(shù)量的數(shù)據庫實例句柄,然后添加到m_free_list中,供后面使用
GetDBConn()函數(shù): 用于從空閑隊列中返回可以使用的數(shù)據庫連接句柄
RelDBConn()函數(shù): 程序使用完該數(shù)據庫句柄之后,將句柄放回到空閑隊列中
測試之前,將代碼中的數(shù)據庫地址、端口、賬號密碼等改為自己的(代碼中有好幾處)
進入MySQL, 創(chuàng)建mysql_pool_test數(shù)據庫
進入到mysql_pool目錄下, 創(chuàng)建一個build目錄并進入 :
然后輸入如下的命令進行編譯
之后就會在目錄下生成如下的可執(zhí)行文件
輸入如下兩條命令進行測試: 可以看到不使用數(shù)據庫連接池,整個操作耗時4秒左右;使用連接池之后,整個操作耗時2秒左右,提升了一倍
源碼下載
下面介紹redis_pool
測試
進入到redis_pool目錄下, 創(chuàng)建一個build目錄并進入 :
然后輸入如下的命令進行編譯
之后就會在目錄下生成如下的可執(zhí)行文件
輸入如下的命令進行測試: 可以看到不使用數(shù)據庫連接池,整個操作耗時182ms;使用連接池之后,整個操作耗時21ms,提升了很多
進入redis,可以看到我們新建的key:
如果你想在action里判斷數(shù)據庫是否鏈接,只能創(chuàng)建一個標記。全局變量。比如isConn.當創(chuàng)建鏈接的時候把這個標記設置為1.關閉數(shù)據庫的時候標記重置 為0.這樣在action里不用獲取connection對像,直接判斷這個全局標記就可以了。
還有就是在創(chuàng)建鏈接之前先判斷這個標記是否是0。在關閉鏈接之前判斷這個標記是否為1
1、把數(shù)據庫驅動包 copy 到 %CATALINA_HOME%\common\lib 下。
2、修改 %CATALINA_HOME%\conf\server.xml 文件,在 Host 節(jié)點下添加:
XML/HTML code?
!-- appName 為項目名 --!
Context path="/appName" docBase="appName" auth="Container"
Resource name="jdbc/MySQLDS" scope="Shareable"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/test?useUnicode=truecharact-erEncoding=GBK"
driverClassName="com.mysql.jdbc.Driver"
username="root" password="111111"
maxWait="3000" maxIdle="100" maxActive="10" /
/Context
(或者在 %appName%\META-INF 下建立 context.xml,內容為上面的代碼。)
3、修改 web.xml,在 web-app 節(jié)點下添加:
XML/HTML code?
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DBUtil {
public Connection getConnection() throws Exception {
Context context = new InitialContext();
// 獲取數(shù)據源
DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/MySQLDS");
// 獲取數(shù)據庫連接
Connection conn = ds.getConnection();
if (conn != null !conn.isClosed()) {
return conn;
} else {
return null;
}
}
}