importMySQLdbimporttimeimportstringimportredisclassPooledConnection:#構(gòu)建連接池實(shí)例def__init__(self,maxconnections,connstr,dbtype):fromQueueimportQueueself._pool=Queue(maxconnections)#createthequeueself.connstr=connstrself.dbtype=dbtypeself.maxconnections=maxconnections#根據(jù)你給數(shù)目來(lái)創(chuàng)建鏈接,并且寫(xiě)入剛才創(chuàng)建的隊(duì)列里面。try:foriinrange(maxconnections):self.fillConnection(self.CreateConnection(connstr,dbtype))exceptException,e:raiseedeffillConnection(self,conn):try:self._pool.put(conn)exceptException,e:raise"fillConnectionerror:"+str(e)defreturnConnection(self,conn):try:self._pool.put(conn)exceptException,e:raise"returnConnectionerror:"+str(e)defgetConnection(self):try:returnself._pool.get()exceptException,e:raise"getConnectionerror:"+str(e)defColseConnection(self,conn):try:self._pool.get().close()self.fillConnection(self.CreateConnection(connstr,dbtype))exceptException,e:raise"CloseConnectionerror:"+str(e)defCreateConnection(self,connstr,dbtype):ifdbtype=='xxx':passelifdbtype=='mysql':try:db_conn=connstr.split("#");#conndb=MySQLdb.connect(db=conf.mydb,host=conf.dbip,user=conf.myuser,passwd=conf.mypasswd);conndb=MySQLdb.connect(user=db_conn[0],passwd=db_conn[1],host=db_conn[2],port=string.atoi(db_conn[3]),db=db_conn[4]);conndb.clientinfo='datasyncconnectionpoolfromdatasync.py';conndb.ping();exceptException,e:raise'conntargetdbdatasourceExcepts,%s!!!(%s).'%(db_conn[2],str(e))returnNone#mysql如下創(chuàng)建連接池:connstring="xiaorui.cc#xiaoru.cc#xiaorui.cc#3306#dbname";mysqlpool=PooledConnection(10,connstring,"mysql");#獲取連接:mysqlpool.getConnection()

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)薛城,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
數(shù)據(jù)庫(kù)連接池(Connection pooling)是程序啟動(dòng)時(shí)建立足夠的數(shù)據(jù)庫(kù)連接,并將這些連接組成一個(gè)連接池,由程序動(dòng)態(tài)地對(duì)池中的連接進(jìn)行申請(qǐng),使用,釋放。
簡(jiǎn)單的說(shuō):創(chuàng)建數(shù)據(jù)庫(kù)連接是一個(gè)很耗時(shí)的操作,也容易對(duì)數(shù)據(jù)庫(kù)造成安全隱患。所以,在程序初始化的時(shí)候,集中創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)連接,并把他們集中管理,供程序使用,可以保證較快的數(shù)據(jù)庫(kù)讀寫(xiě)速度,還更加安全可靠。
不使用數(shù)據(jù)庫(kù)連接池
如果不使用數(shù)據(jù)庫(kù)連接池,對(duì)于每一次SQL操作,都要走一遍下面完整的流程:
1.TCP建立連接的三次握手(客戶端與 MySQL服務(wù)器的連接基于TCP協(xié)議)
2.MySQL認(rèn)證的三次我收
3.真正的SQL執(zhí)行
4.MySQL的關(guān)閉
5.TCP的四次握手關(guān)閉
可以看出來(lái),為了執(zhí)行一條SQL,需要進(jìn)行大量的初始化與關(guān)閉操作
使用數(shù)據(jù)庫(kù)連接池
如果使用數(shù)據(jù)庫(kù)連接池,那么會(huì) 事先申請(qǐng)(初始化)好 相關(guān)的數(shù)據(jù)庫(kù)連接,然后在之后的SQL操作中會(huì)復(fù)用這些數(shù)據(jù)庫(kù)連接,操作結(jié)束之后數(shù)據(jù)庫(kù)也不會(huì)斷開(kāi)連接,而是將數(shù)據(jù)庫(kù)對(duì)象放回到數(shù)據(jù)庫(kù)連接池中
資源重用:由于數(shù)據(jù)庫(kù)連接得到重用,避免了頻繁的創(chuàng)建、釋放連接引起的性能開(kāi)銷,在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增進(jìn)了系統(tǒng)運(yùn)行環(huán)境的平穩(wěn)性(減少內(nèi)存碎片以及數(shù)據(jù)庫(kù)臨時(shí)進(jìn)程/線程的數(shù)量)。
更快的系統(tǒng)響應(yīng)速度:數(shù)據(jù)庫(kù)連接池在初始化過(guò)程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫(kù)連接置于池中備用。 此時(shí)連接的初始化工作均已完成。對(duì)于業(yè)務(wù)請(qǐng)求處理而言,直接利用現(xiàn)有可用連接,避免了從數(shù)據(jù)庫(kù)連接初始化和釋放過(guò)程的開(kāi)銷,從而縮減了系統(tǒng)整體響應(yīng)時(shí)間。
統(tǒng)一的連接管理,避免數(shù)據(jù)庫(kù)連接泄露:在較為完備的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的連接占用超時(shí)設(shè)定,強(qiáng)制收回被占用連接。從而避免了常規(guī)數(shù)據(jù)庫(kù)連接操作中可能出現(xiàn)的資源泄露。
如果說(shuō)你的服務(wù)器CPU是4核i7的,連接池大小應(yīng)該為((4*2)+1)=9
相關(guān)視頻推薦
90分鐘搞懂?dāng)?shù)據(jù)庫(kù)連接池技術(shù)|linux后臺(tái)開(kāi)發(fā)
《tcp/ip詳解卷一》: 150行代碼拉開(kāi)協(xié)議棧實(shí)現(xiàn)的篇章
學(xué)習(xí)地址:C/C++Linux服務(wù)器開(kāi)發(fā)/后臺(tái)架構(gòu)師【零聲教育】-學(xué)習(xí)視頻教程-騰訊課堂
需要C/C++ Linux服務(wù)器架構(gòu)師學(xué)習(xí)資料加qun 812855908 獲取(資料包括 C/C++,Linux,golang技術(shù),Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg 等),免費(fèi)分享
源碼下載
下載方式:(Github中下載)
db_pool目錄下有兩個(gè)目錄,mysql_pool目錄為MySQL連接池代碼,redis_pool為redis連接池代碼
下面介紹mysql_pool
CDBConn解析
概念: 代表一個(gè)數(shù)據(jù)連接對(duì)象實(shí)例
相關(guān)成員:
m_pDBPool:該數(shù)據(jù)庫(kù)連接對(duì)象所屬的數(shù)據(jù)庫(kù)連接池
構(gòu)造函數(shù): 綁定自己所屬于哪個(gè)數(shù)據(jù)庫(kù)連接池
Init()函數(shù): 創(chuàng)建數(shù)據(jù)庫(kù)連接句柄
CDBPool解析
概念:代表一個(gè)數(shù)據(jù)庫(kù)連接池
相關(guān)成員:
Init()函數(shù):常見(jiàn)指定數(shù)量的數(shù)據(jù)庫(kù)實(shí)例句柄,然后添加到m_free_list中,供后面使用
GetDBConn()函數(shù): 用于從空閑隊(duì)列中返回可以使用的數(shù)據(jù)庫(kù)連接句柄
RelDBConn()函數(shù): 程序使用完該數(shù)據(jù)庫(kù)句柄之后,將句柄放回到空閑隊(duì)列中
測(cè)試之前,將代碼中的數(shù)據(jù)庫(kù)地址、端口、賬號(hào)密碼等改為自己的(代碼中有好幾處)
進(jìn)入MySQL, 創(chuàng)建mysql_pool_test數(shù)據(jù)庫(kù)
進(jìn)入到mysql_pool目錄下, 創(chuàng)建一個(gè)build目錄并進(jìn)入 :
然后輸入如下的命令進(jìn)行編譯
之后就會(huì)在目錄下生成如下的可執(zhí)行文件
輸入如下兩條命令進(jìn)行測(cè)試: 可以看到不使用數(shù)據(jù)庫(kù)連接池,整個(gè)操作耗時(shí)4秒左右;使用連接池之后,整個(gè)操作耗時(shí)2秒左右,提升了一倍
源碼下載
下面介紹redis_pool
測(cè)試
進(jìn)入到redis_pool目錄下, 創(chuàng)建一個(gè)build目錄并進(jìn)入 :
然后輸入如下的命令進(jìn)行編譯
之后就會(huì)在目錄下生成如下的可執(zhí)行文件
輸入如下的命令進(jìn)行測(cè)試: 可以看到不使用數(shù)據(jù)庫(kù)連接池,整個(gè)操作耗時(shí)182ms;使用連接池之后,整個(gè)操作耗時(shí)21ms,提升了很多
進(jìn)入redis,可以看到我們新建的key:
eb開(kāi)發(fā)中與數(shù)據(jù)庫(kù)的連接是必不可少的,而數(shù)據(jù)庫(kù)連接池技術(shù)很好的優(yōu)化了動(dòng)態(tài)頁(yè)與數(shù)據(jù)庫(kù)的連接,相比單個(gè)連接數(shù)據(jù)庫(kù)連接池節(jié)省了很大的資源。用一個(gè)通俗的比喻:如果一個(gè)人洗澡需花一桶水,那一百個(gè)人就要花一百桶水,太浪費(fèi)了.如果都在池子里洗,洗多少個(gè)人都不怕了。
1.將MySQL的JDBC驅(qū)動(dòng)復(fù)制到Tomcat安裝目錄里的lib文件夾下。驅(qū)動(dòng)可以從MySQL官網(wǎng)上下載,為jar包。
2.將Tomcat的配置文件Context.xml做如下修改:
Context path="/DBTest" docBase="DBTest"
debug="5" reloadable="true" crossContext="true"
!-- maxActive: Maximum number of dB connections in pool. Make sure you
configure your mysqld max_connections large enough to handle
all of your db connections. Set to -1 for no limit.
--
!-- maxIdle: Maximum number of idle dB connections to retain in pool.
Set to -1 for no limit. See also the DBCP documentation on this
and the minEvictableIdleTimeMillis configuration parameter.
--
!-- maxWait: Maximum time to wait for a dB connection to become available
in ms, in this example 10 seconds. An Exception is thrown if
this timeout is exceeded. Set to -1 to wait indefinitely.
--
!-- username and password: MySQL dB username and password for dB connections --
!-- driverClassName: Class name for the old mm.mysql JDBC driver is
org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
--
!-- url: The JDBC connection url for connecting to your MySQL dB.
The autoReconnect=true argument to the url makes sure that the
mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
connection. mysqld by default closes idle connections after 8 hours.
--
Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/
/Context
注意代碼中紅色部分:DBTest 改為自己的項(xiàng)目路徑;TestDB改為自己的數(shù)據(jù)源名,但是后面使用時(shí)候要與這里的配置保持一致;javauser和 javauser改為自己MySQL的用戶名密碼;url的格式依次為jdbc:mysql://{你的數(shù)據(jù)庫(kù)服務(wù)所在的IP,如果為本機(jī)就為localhost}:{你的數(shù)據(jù)庫(kù)服務(wù)端口號(hào)}/{MySQL中要使用的數(shù)據(jù)庫(kù)名稱}?autoReconnect=true 。
3.修改項(xiàng)目WEB-INF/web.xml 配置文件(若無(wú),請(qǐng)新建),在“/web-app”之上添加如下代碼:
resource-ref
descriptionDB Connection/description
res-ref-namejdbc/TestDB/res-ref-name
res-typejavax.sql.DataSource/res-type
res-authContainer/res-auth
/resource-ref
上步中若修改了數(shù)據(jù)源名此步中紅色部分請(qǐng)保持與上步中的一致。
4.代碼示例:
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/TestDB");
Connection conn = ds.getConnection();
Statement st = null;
ResultSet rs = null;
st = conn.createStatement();
rs = st.executeQuery(yoursql);
注意紅色部分與上兩步中的一致;yoursql處寫(xiě)你的sql代碼。
通過(guò)1-3步就在Tomcat中配置好了MySQL的數(shù)據(jù)庫(kù)連接池。
現(xiàn)在常用的開(kāi)源數(shù)據(jù)庫(kù)連接池主要有c3p0、dbcp、proxool三種,其中:
Spring 推薦使用dbcp;
Hibernate 推薦使用c3p0和proxool;
1、 DBCP:apache
DBCP(DataBase connection pool)數(shù)據(jù)庫(kù)連接池。是apache上的一個(gè) java連接池項(xiàng)目,也是 tomcat使用的連接池組件。單獨(dú)使用dbcp需要3個(gè)包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立數(shù)據(jù)庫(kù)連接是一個(gè)非常耗時(shí)耗資源的行為,所以通過(guò)連接池預(yù)先同數(shù)據(jù)庫(kù)建立一些連接,放在內(nèi)存中,應(yīng)用程序需要建立數(shù)據(jù)庫(kù)連接時(shí)直接到連接池中申請(qǐng)一個(gè)就行,用完后再放回去。dbcp沒(méi)有自動(dòng)的去回收空閑連接的功能。
2、 C3P0:
C3P0是一個(gè)開(kāi)源的jdbc連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和jndi綁定,支持jdbc3規(guī)范和jdbc2的標(biāo)準(zhǔn)擴(kuò)展。c3p0是異步操作的,緩慢的jdbc操作通過(guò)幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能。目前使用它的開(kāi)源項(xiàng)目有Hibernate,Spring等。c3p0有自動(dòng)回收空閑連接功能。
3、 Proxool:Sourceforge
Proxool是一種Java數(shù)據(jù)庫(kù)連接池技術(shù)。是sourceforge下的一個(gè)開(kāi)源項(xiàng)目,這個(gè)項(xiàng)目提供一個(gè)健壯、易用的連接池,最為關(guān)鍵的是這個(gè)連接池提供監(jiān)控的功能,方便易用,便于發(fā)現(xiàn)連接泄漏的情況。
對(duì)比:
1 相同時(shí)間內(nèi)同等量的線程數(shù)和循環(huán)次數(shù)下:通過(guò)對(duì)三個(gè)連接池的三個(gè)標(biāo)志性性能測(cè)試參數(shù)(Average,median,90%Line)進(jìn)行比較發(fā)現(xiàn):性能dbcp=c3p0proxool;
2 不同情況下的同一數(shù)據(jù)庫(kù)連接池測(cè)試:通過(guò)觀察 Average,median,90%Line三個(gè)參數(shù)發(fā)
現(xiàn)三個(gè)連接池的穩(wěn)定性(三種連接池的三個(gè)測(cè)試參數(shù)的變化情況)依次:穩(wěn)定性dbcp=c3p0proxool。
結(jié)論:
通過(guò)對(duì)三種數(shù)據(jù)庫(kù)連接池的性能測(cè)試發(fā)現(xiàn),proxool和 c3p0能夠更好的支持高并發(fā),但是在穩(wěn)定性方面略遜于 dpcp;
一、要在JBoss中使用MySQL的話首先要把MySQL的JDBC驅(qū)動(dòng)放到CLASSPATH中。然后再JBoss配置。
二、再把/docs/examples/jca/mysql-ds.xml復(fù)制到/server/default/deploy目錄下。修改mysql-ds.xml文件,其中是數(shù)據(jù)庫(kù)主機(jī)名是數(shù)據(jù)庫(kù)名。
我的mysql-ds.xml如下
三、然后需要JBoss配置standardjaws.xml (注:\server\default\conf目錄下)文件。
四、同樣也需要把JBosscmp-jdbc.xml文件 注: \server\default\conf目錄下)。
五、最后再修改login-config.xml(\server\default\conf目錄下)文件來(lái)使用。
六、測(cè)試代碼。
本文標(biāo)題:mysql怎么連接池子,mysql默認(rèn)連接池大小
標(biāo)題網(wǎng)址:http://chinadenli.net/article17/dsgpddj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、品牌網(wǎng)站建設(shè)、用戶體驗(yàn)、做網(wǎng)站、網(wǎng)站排名、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)