溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

淺談django url請(qǐng)求與數(shù)據(jù)庫連接池的共享問題

發(fā)布時(shí)間:2020-10-10 21:10:03 來源:腳本之家 閱讀:151 作者:rongyongfeikai2 欄目:開發(fā)技術(shù)

但凡介紹數(shù)據(jù)庫連接池的文章,都會(huì)說“數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點(diǎn)在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)得尤為突出。對(duì)數(shù)據(jù)庫連接的管理能顯著影響到整個(gè)應(yīng)用程序的伸縮性和健壯性,影響到程序的性能指標(biāo)。數(shù)據(jù)庫連接池正是針對(duì)這個(gè)問題提出來的。數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項(xiàng)技術(shù)能明顯提高對(duì)數(shù)據(jù)庫操作的性能?!?/p>

這句話雖然說得很好,但也很讓人疑惑。比如,多個(gè)請(qǐng)求是怎樣共用數(shù)據(jù)庫連接池???

其實(shí),數(shù)據(jù)庫連接池主要是利用了程序,靜態(tài)變量與靜態(tài)方法的概念實(shí)現(xiàn)的。靜態(tài)變量和靜態(tài)方法,是程序運(yùn)行時(shí),就被加載到內(nèi)存中的。該進(jìn)程中所有對(duì)于它的訪問,都是對(duì)“唯一”的它的訪問。所以,才能有數(shù)據(jù)庫連接池被共享的概念。

淺談django url請(qǐng)求與數(shù)據(jù)庫連接池的共享問題

可以看到,靜態(tài)變量a以及靜態(tài)方法add,即使類A從未被實(shí)例化過,它們也都會(huì)被加載到內(nèi)存中。

另外,在python的此次運(yùn)行(一個(gè)進(jìn)程)中,多次對(duì)a的操作,都是對(duì)為一個(gè)的這個(gè)a變量的操作,所以它的值是在被操作后累加的。

這個(gè)在我上面簡(jiǎn)單的例子中很好理解。那么如何理解Web應(yīng)用程序(如django程序)在接到url請(qǐng)求時(shí)的場(chǎng)景呢?在多個(gè)請(qǐng)求時(shí),他們是如何可以共享數(shù)據(jù)庫連接池的?

我寫了一個(gè)簡(jiǎn)單的例子:

Test model,使用了單例模式,它的功能是調(diào)用sqlalchemy.pool中的數(shù)據(jù)庫連接池。

淺談django url請(qǐng)求與數(shù)據(jù)庫連接池的共享問題

而views.py的index方法,則是調(diào)用Test的getinstance方法獲得它的實(shí)例,同時(shí)用它的數(shù)據(jù)庫連接池。

淺談django url請(qǐng)求與數(shù)據(jù)庫連接池的共享問題

為了看得清楚,我在這個(gè)方法中增加打印了當(dāng)前所屬進(jìn)程的pid,test和test.connpool信息。

首先要說明一點(diǎn),apache在windows和linux中的運(yùn)行方式不盡相同(windows是兩個(gè)httpd進(jìn)程,一個(gè)父進(jìn)程,一個(gè)子進(jìn)程,子進(jìn)程里面多個(gè)線程處理請(qǐng)求)。在linux中,默認(rèn)用prefork的方式運(yùn)行。即一個(gè)父進(jìn)程,多個(gè)子進(jìn)程,這多個(gè)子進(jìn)程負(fù)責(zé)處理web請(qǐng)求。

如下圖所示:

淺談django url請(qǐng)求與數(shù)據(jù)庫連接池的共享問題

然后我們嘗試多次url請(qǐng)求(適當(dāng)變化url,避免緩存);并記錄結(jié)果:

http://10.67.2.21:8081/ips/
count:3,processid:20016<br/>test:<ipsapp.models.Test object at 0x7f2b1070ac50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b1070ad10>

http://10.67.2.21:8081/ips/?user=kjsdkfjsdf&kljsdlkfjsdf
count:3,processid:20013<br/>test:<ipsapp.models.Test object at 0x7f2b107c6c10>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b107c6cd0>

http://10.67.2.21:8081/ips/?user=kjsdkfjsdf&kljsdlkfjsdf&pass=ksjdkjdf
count:3,processid:20018<br/>test:<ipsapp.models.Test object at 0x7f2b103c6c50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b103c6d10>

http://10.67.2.21:8081/ips/?user=123u42i3u4
count:3,processid:20016<br/>test:<ipsapp.models.Test object at 0x7f2b1070ac50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b1070ad10>

http://10.67.2.21:8081/ips/?user=123u42i3u4&tewstsjdfkjslfj
count:3,processid:20013<br/>test:<ipsapp.models.Test object at 0x7f2b107c6c10>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b107c6cd0>

http://10.67.2.21:8081/ips/?user=passwode
count:3,processid:20018<br/>test:<ipsapp.models.Test object at 0x7f2b103c6c50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b103c6d10>

http://10.67.2.21:8081/ips/?newiusd=kjsdkjfd&kjsdkjf=ksdjflksjdlkf
count:3,processid:20016<br/>test:<ipsapp.models.Test object at 0x7f2b1070ac50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b1070ad10>

apache pid Test object QueuePool object
20016 0x7f2b1070ac50 0x7f2b1070ad10
20013 0x7f2b107c6c10 0x7f2b107c6cd0
20018 0x7f2b103c6c50 0x7f2b103c6d10
20016 0x7f2b1070ac50 0x7f2b1070ad10
20013 0x7f2b107c6c10 0x7f2b107c6cd0
20018 0x7f2b103c6c50 0x7f2b103c6d10
20016 0x7f2b1070ac50 0x7f2b1070ad10

我把分屬于不同apache進(jìn)程處理的請(qǐng)求用顏色標(biāo)出了,在本例子中,7個(gè)請(qǐng)求,分配到了3個(gè)apache進(jìn)程處理。可以看到,被同一個(gè)apache子進(jìn)程處理的請(qǐng)求,是共用同一個(gè)test和test.connpool實(shí)例的,即他們共享數(shù)據(jù)庫連接池。

所以,數(shù)據(jù)庫連接池,對(duì)于web請(qǐng)求而言,是屬于同一個(gè)apache子進(jìn)程處理的請(qǐng)求共用一個(gè)數(shù)據(jù)庫連接池。

以上這篇淺談django url請(qǐng)求與數(shù)據(jù)庫連接池的共享問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI