91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django數據庫連接模塊的示例分析

發布時間:2021-07-24 14:21:14 來源:億速云 閱讀:121 作者:小新 欄目:開發技術

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

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

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

但對于頻繁進行數據庫連接并操作數據庫的業務,反復創建連接并不是好的選擇,這種場景下可以考慮將連接改造為長連接。

1. django 代碼的閱讀筆記

django.db.__init__.py 
#對象:
connections = ConnectionHandler()
connection = DefaultConnectionProxy()
# 函數
# 重置查詢記錄緩存
def reset_queries(**kwargs):
 pass
# 關閉不可用或超時(如果有設置 CONN_MAX_AGE)連接
def close_old_connections(**kwargs):
 pass
# 信號
# 在請求開始或完成時自動調用相應處理函數
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內置對象及連接管理:

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

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

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

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

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

在線程池的情況下,close_old_connections方法是不能將線程中的數據庫連接關閉的。

connection是DefaultConnectionProxy類的實例,實際是DatabaseWrapper的實例 
(使用了pymysql庫:import pymysql; pymysql.install_as_MySQLdb) 
DefaultConnectionProxy–>DatabaseWrapper–>pymysql.connections.Connection(根據connections的處理調用相應的數據庫連接包) 
connection有幾個關鍵方法和屬性

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

connection.connect()# 獲取連接
connection.cursor() # 獲取游標
connection.close()# 關閉連接

2. 將數據庫連接改造為長連接

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

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

全局變量

max_age = 7 * 3600

在線程內開始時做下判斷:

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!"

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

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

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

以上是“django數據庫連接模塊的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄平县| 康乐县| 勃利县| 库尔勒市| 社会| 池州市| 襄汾县| 虎林市| 太康县| 明溪县| 哈密市| 吉安市| 固镇县| 泽州县| 清河县| 新邵县| 苗栗县| 三门县| 镇巴县| 东乌珠穆沁旗| 新兴县| 独山县| 永春县| 浦北县| 望都县| 柏乡县| 济源市| 和政县| 大石桥市| 广宗县| 安化县| 沙坪坝区| 珲春市| 泗洪县| 高州市| 梓潼县| 商水县| 永清县| 泰来县| 武隆县| 普兰店市|