真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

django數(shù)據(jù)庫連接模塊的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹django數(shù)據(jù)庫連接模塊的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、樂東黎族ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的樂東黎族網(wǎng)站制作公司

工作中純服務(wù)端的項目用到了線程池和django的ORM部分。django 的數(shù)據(jù)庫連接在每一個線程中開啟一份,并在查詢完畢后自動關(guān)閉連接。

線程池處理任務(wù)時,正常使用的連接中不會被關(guān)閉,但由于數(shù)據(jù)庫端有最長連接時間的限制(默認(rèn)為8小時),在超時后會發(fā)生InterfaceError: (0, '')(連接關(guān)閉后使用連接/游標(biāo))或Error(2006, 'MySQL server has gone away')(mysql 服務(wù)器主動關(guān)閉連接)這類錯誤,所以一般會在每個任務(wù)線程中調(diào)用django.db.connection.close()進(jìn)行關(guān)閉操作。

但對于頻繁進(jìn)行數(shù)據(jù)庫連接并操作數(shù)據(jù)庫的業(yè)務(wù),反復(fù)創(chuàng)建連接并不是好的選擇,這種場景下可以考慮將連接改造為長連接。

1. django 代碼的閱讀筆記

django.db.__init__.py 
#對象:
connections = ConnectionHandler()
connection = DefaultConnectionProxy()
# 函數(shù)
# 重置查詢記錄緩存
def reset_queries(**kwargs):
 pass
# 關(guān)閉不可用或超時(如果有設(shè)置 CONN_MAX_AGE)連接
def close_old_connections(**kwargs):
 pass
# 信號
# 在請求開始或完成時自動調(diào)用相應(yīng)處理函數(shù)
signals.request_started.connect(reset_queries)
signals.request_started.connect(close_old_connections)
signals.request_finished.connect(close_old_connections)

重點是connections和connection兩個實例

connections 是 ConnectionHandler類

connections.all()會給出一個列表,里面的元素為DatabaseWrapper類

ConnectionHandler內(nèi)置對象及連接管理:

def __init__():
 self._connections = local()

# 連接包裝類里的連接是根據(jù)配置情況使用相應(yīng)的連接
def __getitem__(self, alias):
 '''略'''
 db = self.databases[alias]
 backend = load_backend(db['ENGINE'])
 conn = backend.DatabaseWrapper(db, alias)
 setattr(self._connections, alias, conn)

# 返回所管理的數(shù)據(jù)庫連接
# 管理方式:分?jǐn)?shù)據(jù)庫,線程管理連接 
def all(self):
 return [self[alias] for alias in self]

# 關(guān)閉所有數(shù)據(jù)庫連接
def close_all(self):
 for alias in self:
  try:
   connection = getattr(self._connections, alias)
  except AttributeError:
   continue
  connection.close()

threading.local 是一個全局變量,local的屬性是非線程共享的,也就是在每一個線程中都會有單獨(dú)一個數(shù)據(jù)庫連接實例創(chuàng)建,因為代理及包裝的原因,該連接實例為對應(yīng)backend里的連接(比如,pymysql.connections.Connection)。

在線程池的情況下,close_old_connections方法是不能將線程中的數(shù)據(jù)庫連接關(guān)閉的。

connection是DefaultConnectionProxy類的實例,實際是DatabaseWrapper的實例 
(使用了pymysql庫:import pymysql; pymysql.install_as_MySQLdb) 
DefaultConnectionProxy–>DatabaseWrapper–>pymysql.connections.Connection(根據(jù)connections的處理調(diào)用相應(yīng)的數(shù)據(jù)庫連接包) 
connection有幾個關(guān)鍵方法和屬性

connection.connection = '被包裝的pymysql.connections.Connection實例`
connection.close_at = None if max_age is None else time.time() + max_age # 設(shè)置的連接關(guān)閉時間

connection.connect()# 獲取連接
connection.cursor() # 獲取游標(biāo)
connection.close()# 關(guān)閉連接

2. 將數(shù)據(jù)庫連接改造為長連接

max_age(CONN_MAX_AGE) 是可以在settings里面配置的。

由于多個服務(wù)共用一套配置, 所以考慮直接在程序里修改

全局變量

max_age = 7 * 3600

在線程內(nèi)開始時做下判斷:

if not db.connection.connection or db.connection.close_at < time.time():
 db.connection.close()
 db.connection.connect()
 db.connection.close_at = time.time() + max_age
 print "A new conn creates !"
else:
 print "Still old conn!"

這樣每個線程池中的線程會循環(huán)執(zhí)行任務(wù)并只使用同一個連接,并可以控制在自己需要的連接時長后更換連接。

針對線程池的情況,close_old_connections基本沒啥用處, 可以跳過該處理

django.db.close_old_connections = lambda **kwargs : None

以上是“django數(shù)據(jù)庫連接模塊的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


文章標(biāo)題:django數(shù)據(jù)庫連接模塊的示例分析-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://weahome.cn/article/dieojd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部