1. 程式人生 > >淺析資料庫連線池(一)

淺析資料庫連線池(一)

由於最近專案要用到資料庫連線池,所以今天簡單的聊聊~,
這個話題的引起是因為我在寫mysql資料庫部分時產生了一個疑問,一般後臺處理資料部分,服務端是建立一個connection連線到資料庫,然後所有的請求通過這一個connection來訪問資料庫,還是每個連線建立一個connction?這個連線需要維持多久?…接下來一起看看
首先目錄1,2是為了引出下面的連線池,因為一般我們僅僅是使用資料庫,而忽略了一些內在的東西,這就可能會出現一些效率方面的問題。

4,5連線池的使用和最優連線池配置選擇我在下一篇部落格介紹。

總目錄:
-1.資料庫連線過程是怎樣的?
-2.連線所佔用的資源有哪些?
-3.連線池簡介
-4.連線池的使用


-5.最優連線池配置選擇

1.資料庫的連線過程是怎樣的?

資料庫本身也是有一個server端程式在跑的,可以這麼說它也是一個後臺服務端的程式,我使用的是mysql,在/etc/init.d下面有個mysql.server,開機即啟動mysql伺服器。
我們一般使用mysql -uroot -p只不過是使用了管理員的身份來建立一個connection,從而登入mysql。
下面仔細說說mysql連線過程

mysql連線分為兩種,一種為unix domain socket,另外一種為基於tcp/ip協議,一般我們如果遠端訪問資料庫肯定是基於tcp/ip的,但是如果我們在本機登入就會分為使用socket還是tcp/ip。
socket:mysql -h localhost -uroot -p

或者mysql -uroot -p
tcp/ip :mysql -h 127.0.0.1 -uroot -p

為了證明,我用tcpdump抓個包看看^_^
socket:
這裡寫圖片描述
可以看到unix domain socket並沒有被抓到,因為它是不經過網絡卡的,本地的。
tcp/ip:
這裡寫圖片描述

tcp/ip就抓到資料了,由此我們可以看出mysql的連線過程,內部實際上是經過tcp/ip協議的,當然mysql封裝了tcp/ip有自己的一套協議。

下面我每執行一條sql語句都會有對應的資料包,那麼很明顯了mysql的連線方式和通訊方式,在退出mysql時抓到了4條資料,4次揮手唄。

據官網說unix domain socket連線快於tcp/ip連線

A MySQL client on Unix can connect to the mysqld server in two different ways: By using a Unix socket file to connect through a file in the file system (default /tmp/mysql.sock), or by using TCP/IP, which connects through a port number. A Unix socket file connection is faster than TCP/IP, but can be used only when connecting to a server on the same computer. A Unix socket file is used if you don’t specify a host name or if you specify the special host name loc -alhost.`
所以同一臺電腦上我們就使用unix domain socket吧~

其次,mysql是會建立一個執行緒來處理到來的連線的,我們可以在mysql中show status;然後在連線mysql,再次show status就可以看到Thread_connected的數量會增加1,說明建立了一個執行緒來處理這個連線。
這裡寫圖片描述

看上圖,我們可以看到Threads_connected連線數是1,因為此時只有我一個在連線mysql,Threads_created為3,說明曾經有3個connection連線過資料庫,Threads_cached這個是mysql為了提高效能而在內部提供了一個執行緒的連線池,將空閒的連線不是立即銷燬而是放到執行緒連線池中,如果新加進來連線不是立刻建立執行緒而是先從執行緒連線池中找到空閒的連線執行緒,然後分配,如果沒有才建立新的執行緒。可見mysql內部已經為我們做優化了。

Threads_catched值不是無限大的,一般為32左右。
順便說一句,mysql是可以調整單執行緒和多執行緒模式的,單執行緒只允許一個執行緒連線mysql,其他連線將會被拒絕。
| thread_handling | one-thread-per-connection |

總結並補充上面,那麼資料庫連線的大致為:
1.應用資料層向DataSource請求資料庫連線
2.DataSource使用資料庫Driver開啟資料庫連線
3.建立資料庫連線,內部可能建立執行緒,開啟TCP socket
4.應用讀/寫資料庫
5.如果該連線不再需要就關閉連線
6.關閉socket

連線過程就簡單的說到這。

2.連線所佔用的資源有哪些?

mysql連線所佔資源有哪些?
從上面可以看出來我們一般寫的網路程式都是基於tcp/ip連線訪問資料庫的,先說下mysql是有最大連線數的。

輸入/usr/bin/mysqladmin -uroot -p variables | grep max_connections
這裡寫圖片描述

我的mysql最大連線數是151,我們可以更改配置檔案來改變最大連線數限制,但是否真的好,有待討論,因為系統預設設定肯定會根據系統所能承受的連線或者是給予的資源等等來限定。所以我們就假設不改變引數的情況下所能提供的連線是151。

首先mysql每個連線是會建立一個執行緒的,可以登入mysql輸入show status檢視Threads_connected和Threads_created的大小,那麼我們每連線一次mysql就會建立一個執行緒,每次斷開又會銷燬一個執行緒。

我們都知道建立執行緒和銷燬執行緒的資源消耗是非常大的,不然也不會有執行緒池這個東西了,那麼!從某個角度來看,連線池避免了頻繁的建立連線和銷燬連線(前面我們知道mysql已經做了Threads_catched優化,但是還不夠),其實內部也避免了頻繁的建立執行緒和銷燬執行緒!是不是很類似執行緒池?,就像我的一個學長說的,××池名字聽起來很高大上,其實就那麼回事,原理是相通的,原理很重要。
那麼執行緒建立和銷燬,以及消耗的資源我們應該很熟悉了。
首先每個執行緒會分配棧空間,可以通過ulimis -s來檢視,我的ubuntu 14.04預設是8M,那麼100個連線就是800M,很吃記憶體的。其次mysql資料庫會為每個連線分配連線緩衝區和結果緩衝區,也是要消耗時間的。

接著每次每個連線都會進行tcp3次握手和斷開時的4次揮手,分配一些快取之類的空間,記得曾經看過一點點關於協議棧的東西,裡面的資料結構,等待佇列之類感覺也蠻複雜的,且雖然tcp連線耗費的資源不多,分配的時間也短,但如果我們能夠節省豈不是更好~(關於tcp連線和斷開資源消耗我並沒有深究,抽空再補充吧~,感興趣大家可以查下資料)。

3.連線池簡介

呼~終於到了主題連線池了,其實前面說了這麼多都是為了突出連線池的好……
資料庫連線池技術的思想非常簡單,將資料庫連線作為物件儲存在一個Vector物件中,一旦資料庫連線建立後,不同的資料庫訪問請求就可以共享這些連線,這樣,通過複用這些已經建立的資料庫連線,可以克服上述缺點,極大地節省系統資源和時間。
也就是我們提前建立好這些連線,然後需要用去取連線即可。和執行緒池的思想是一致的。

這裡寫圖片描述
(圖片來源網路)

連線池的操作:
(1)建立資料庫連線池物件(伺服器啟動)。
(2)按照事先指定的引數建立初始數量的資料庫連線(即:空閒連線數)。
(3)對於一個數據庫訪問請求,直接從連線池中得到一個連線。如果資料庫連線池物件中沒有空閒的連線,且連線數沒有達到最大(即:最大活躍連線數),建立一個新的資料庫連線。
(4)存取資料庫。
(5)關閉資料庫,釋放所有資料庫連線(此時的關閉資料庫連線,並非真正關閉,而是將其放入空閒佇列中。如實際空閒連線數大於初始空閒連線數則釋放連線)。
(6)釋放資料庫連線池物件(伺服器停止、維護期間,釋放資料庫連線池物件,並釋放所有連線)。

這篇就簡單的介紹到這裡,下篇會介紹連線池的使用和它的配置問題。
謝謝觀看~

相關推薦

淺析資料庫連線

由於最近專案要用到資料庫連線池,所以今天簡單的聊聊~, 這個話題的引起是因為我在寫mysql資料庫部分時產生了一個疑問,一般後臺處理資料部分,服務端是建立一個connection連線到資料庫,然後所有的請求通過這一個connection來訪問資料庫,

Java個人總結——JDBC資料庫連線

三種常見的資料庫連線池 一、DBCP連線池 DBCP(DataBase connection pool),[資料庫連線池]。是 apache 上的一個 java 連線池專案,也是 tomcat 使用的連線池元件。單獨使用dbcp需要2個包:commons-dbcp.

配置資料庫連線資料來源--------java利用BasicDataSource

DataSource又稱為資料來源,該類的目的是為了防止使用資料庫時不必要操作帶來的資源浪費,使用資料庫時需要進行資料庫連線,才可以使用資料庫,使用資料庫後,又要斷開連結,用來釋放資源。連結資料庫和斷開資料庫連線浪費資源,而且在頻繁操作資料庫的時候,如果按照沒有資料來源的方式

Mybatis資料來源與連線介紹建立過程

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">小白學習技術,總會遇到各種新知識撲面而來,而未曾深究過的尷尬局面,比如從

【進階之路】和南橘一起探索連線

### 一、連線池的定義 什麼叫連線池?顧名思義,連線池就是將應用所需的連線物件放在池中,每次訪問時從池中獲取,使用完畢再放回池中,以達到連線複用的目的。連線池和執行緒池很像,都是為了**減少連線物件在建立、銷燬連線過程中不必要消耗的資源**。 大家接觸最多的連線池、大概是資料庫連線或者tomcat連線池,

MyBatis原始碼解析之資料來源資料庫連線簡析

一.概述: 常見的資料來源元件都實現了javax.sql.DataSource介面; MyBatis不但要能整合第三方的資料來源元件,自身也提供了資料來源的實現; 一般情況下,資料來源的初始化過程引數較多,比較複雜; 二.設計模式: 為什麼要使用工廠模式     資料來

Java——Web開發之開源的資料庫連線C3P0與DBCP的使用

緊接上一篇資料庫連線池的學習,點連線直達~   資料庫連線池的簡單理解與使用 資料庫連線池DBCP程式碼連線與配置檔案: 1.先匯入使用的jar檔案,分別是dbcp.jar與pool.jar檔案 2.分別使用兩種方式實現,使用配置檔案(dbcpconfig.

常用資料庫連線dbpc,c3p0,Druid

1. 引言 1.1 定義 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。 資料庫連線池負責分配、管理和釋放資料庫連線,它允許應

mysql筆記五——資料庫連線原理、構建和java動態代理的使用

資料庫連線池 1、什麼是資料庫連線池?       資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的資料庫連線來避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。這項

JDBC 資料庫連線DBCP、C3P0 詳解

前言   這段時間狀態有一點浮躁,希望自己靜下心來。還有特別多的東西還沒有學懂。需要學習的東西非常的多,加油! 一、JDBC複習   Java Data Base Connectivity,java資料庫連線,在需要儲存一些資料,或者拿到一些資料的時候,就需要往

JDBC資料庫連線DBCP、C3P0

前言   這段時間狀態有一點浮躁,希望自己靜下心來。還有特別多的東西還沒有學懂。需要學習的東西非常的多,加油! 一、JDBC複習   Java Data Base Connectivity,java資料庫連線,在需要儲存一些資料,或者拿到一些資料的時候,就需要往資料庫裡存取資料。那麼java如何連線資料

JDBC4----------資料庫連線dbcp連線

1、JDBC:是提供用來執行SQL語句的java API.步驟如下:載入驅動程式、與資料庫建立連線、傳送SQL語句、處理結果。2、JTA:事務有提交和回滾兩個概念。提交:所有的操作步驟都被完整的執行後,稱為事務被提交。回滾:由於某一操作步驟執行失敗,導致所有步驟都沒有被提交,

使用資料庫連線C3P0管理資料來源出現的Too many connections問題

使用了Spring的HibernateDaoSupport管理資料DAO,如果在方法中使用了this.getSession()獲取session後,不在後面關閉session(session.close()),就會造成

Druid連接

功能 結合 sql語句 銷毀 prepare 連接 配置filter 更新 優化 介紹 Druid首先是一個數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個SQL Parser。 支持的數據庫 Drui

java並發學習--線程

第一個 down holding scheduled class 缺點 有關 maximum 設計 關於java中的線程池,我一開始覺得就是為了避免頻繁的創建和銷毀線程吧,先創建一定量的線程,然後再進行復用。但是要具體說一下如何做到的,自己又說不出一個一二三來了,這大概就是

java併發學習--執行緒

關於java中的執行緒池,我一開始覺得就是為了避免頻繁的建立和銷燬執行緒吧,先建立一定量的執行緒,然後再進行復用。但是要具體說一下如何做到的,自己又說不出一個一二三來了,這大概就是自己的學習習慣流於表面,不經常深入的結果吧。所以這裡決定系統的學習一下執行緒池的相關知識。   自己稍微總結了一下,

Oracle 資料庫 體系結構:儲存結構

目錄 為什麼要學習體系結構? 體系結構的定義 Oracle 物理結構 Oracle 邏輯結構 總結 為什麼要學習體系結構? 之前的文章有講解到 MySQL 、MongoDB 資料庫,這些資料庫我們安裝好了就能拿來用,比如直接可以做一些:增、刪、改

設計模式綜合例項分析之資料庫同步系統

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Oracle資料庫入門安裝

目錄 Oracle資料庫是什麼? Oracle資料庫和其他資料庫的區別是什麼? Oracle資料庫的安裝 解決方案[INS-13001]環境不滿足最低要求 配置安裝: 驗證oracle安裝成功 Oracle資料庫是什麼? Oracle Database

【python】爬蟲篇:python連線postgresql

本文記錄一下最近在做的事情,會把思考過程和解決問題的方案寫出來。當然,由於本人技術有限,所以可能並不是最好的方案,還請大家見諒!(黑貓白貓只要抓到老鼠,不就是好喵?~) 前言: 事情是這樣的,有一些文章,我要根據文章內容做分類,具體怎麼分我會單獨開一篇文章來講這件事情,這篇文章的重點不是分類