最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django 數(shù)據(jù)庫連接模塊解析及簡單長連接改造方法

 更新時間:2019年08月29日 08:49:45   作者:xwl100  
今天小編就為大家分享一篇django 數(shù)據(jù)庫連接模塊解析及簡單長連接改造方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

線程池處理任務(wù)時,正常使用的連接中不會被關(guān)閉,但由于數(shù)據(jù)庫端有最長連接時間的限制(默認為8小時),在超時后會發(fā)生InterfaceError: (0, '')(連接關(guān)閉后使用連接/游標)或Error(2006, 'MySQL server has gone away')(mysql 服務(wù)器主動關(guān)閉連接)這類錯誤,所以一般會在每個任務(wù)線程中調(diào)用django.db.connection.close()進行關(guā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ù)庫連接
# 管理方式:分數(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的屬性是非線程共享的,也就是在每一個線程中都會有單獨一個數(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() # 獲取游標
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)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python數(shù)據(jù)挖掘Pandas詳解

    Python數(shù)據(jù)挖掘Pandas詳解

    這篇文章主要介紹了Python數(shù)據(jù)挖掘Pandas,pandas是基于numpy模塊構(gòu)建的,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Python爬蟲之Selenium中frame/iframe表單嵌套頁面

    Python爬蟲之Selenium中frame/iframe表單嵌套頁面

    這篇文章主要介紹了Python爬蟲之Selenium中frame/iframe表單嵌套頁面,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 使用tensorflow根據(jù)輸入更改tensor shape

    使用tensorflow根據(jù)輸入更改tensor shape

    這篇文章主要介紹了使用tensorflow根據(jù)輸入更改tensor shape,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • pandas數(shù)值排序的實現(xiàn)實例

    pandas數(shù)值排序的實現(xiàn)實例

    篩選和排序是Excel中使用頻率最多的功能,本文主要介紹了pandas數(shù)值排序的實現(xiàn)實例,文中通過示例代碼介紹的非常詳細,,感興趣的可以了解一下
    2021-07-07
  • 在OpenCV里使用特征匹配和單映射變換的代碼詳解

    在OpenCV里使用特征匹配和單映射變換的代碼詳解

    這篇文章主要介紹了在OpenCV里使用特征匹配和單映射變換的方法,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • 基于python實現(xiàn)分析識別文章/內(nèi)容中的高頻詞和關(guān)鍵詞

    基于python實現(xiàn)分析識別文章/內(nèi)容中的高頻詞和關(guān)鍵詞

    要分析一篇文章的高頻詞和關(guān)鍵詞,可以使用 Python 中的 nltk 庫和 collections 庫或者jieba庫來實現(xiàn),本篇文章介紹基于兩種庫分別實現(xiàn)分析內(nèi)容中的高頻詞和關(guān)鍵詞,需要的朋友可以參考下
    2023-09-09
  • Python+OpenCV實現(xiàn)分水嶺分割算法的示例代碼

    Python+OpenCV實現(xiàn)分水嶺分割算法的示例代碼

    分水嶺算法是用于分割的經(jīng)典算法,在提取圖像中粘連或重疊的對象時特別有用。本文將用Python+OpenCV實現(xiàn)這一算法,需要的可以參考一下
    2022-08-08
  • python讀取文件夾中圖片的圖片名并寫入excel表格

    python讀取文件夾中圖片的圖片名并寫入excel表格

    這篇文章介紹了使用python讀取文件夾中圖片的圖片名并寫入excel表格的方法。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • python用戶管理系統(tǒng)

    python用戶管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Python用戶管理系統(tǒng)的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Pycharm連接遠程mysql報錯的實現(xiàn)

    Pycharm連接遠程mysql報錯的實現(xiàn)

    本文主要介紹了Pycharm連接遠程mysql報錯的實現(xiàn),文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08

最新評論

商南县| 绥江县| 台北县| 遵义市| 长阳| 淅川县| 康定县| 隆化县| 阳曲县| 亚东县| 平利县| 华亭县| 巩留县| 东明县| 家居| 樟树市| 五寨县| 普宁市| 武城县| 镇康县| 渭源县| 德清县| 韶山市| 德江县| 理塘县| 子洲县| 澎湖县| 新巴尔虎右旗| 桦川县| 道孚县| 商河县| 铜川市| 萨嘎县| 汉川市| 洪江市| 康平县| 达尔| 城市| 英山县| 牡丹江市| 马鞍山市|