django 資料庫連線模組解析及簡單長連線改造

2021-08-07 09:50:42 字數 2440 閱讀 9541

工作中純服務端的專案用到了執行緒池和django的orm部分。django 的資料庫連線在每乙個執行緒中開啟乙份,並在查詢完畢後自動關閉連線。

執行緒池處理任務時,正常使用的連線中不會被關閉,但由於資料庫端有最長連線時間的限制(預設為8小時),在超時後會發生inte***ceerror: (0, '')(連線關閉後使用連線/游標)或error(2006, 'mysql server has gone away')(mysql 伺服器主動關閉連線)這類錯誤,所以一般會在每個任務執行緒中呼叫django.db.connection.close()進行關閉操作。

但對於頻繁進行資料庫連線並運算元據庫的業務,反覆建立連線並不是好的選擇,這種場景下可以考慮將連線改造為長連線。

django.db.__init__.py 

#物件:

connections = connectionhandler()

connection = defaultconnectionproxy()

# 函式

# 重置查詢記錄快取

defreset_queries

(**kwargs):

pass

# 關閉不可用或超時(如果有設定 conn_max_age)連線

defclose_old_connections

(**kwargs):

pass

# 訊號

# 在請求開始或完成時自動呼叫相應處理函式

signals.request_started.connect(reset_queries)

signals.request_started.connect(close_old_connections)

signals.request_finished.connect(close_old_connections)

def

__init__():

self._connections = local()

# 連線包裝類裡的連線是根據配置情況使用相應的連線

def__getitem__(self, alias):

'''略'

'' db = self.databases[alias]

backend = load_backend(db['engine'])

setattr(self._connections, alias, conn)

# 返回所管理的資料庫連線

# 管理方式:分資料庫,執行緒管理連線

defall(self):

return [self[alias] for

alias

inself]

# 關閉所有資料庫連線

defclose_all(self):

foralias

inself:

try:

connection = getattr(self._connections, alias)

except attributeerror

: continue

connection.close()

connection.close_at = none if max_age is none else

time.time() + max_age # 設定的連線關閉時間

connection.connect()# 獲取連線

connection.cursor() # 獲取游標

connection.close()# 關閉連線

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連線資料庫

python 2.7 mysql 5.7.17 mysql安裝 mysql服務無法開啟解決方案 django專案連線mysql pip install pymysql init py add the code into the file import pymysql pymysql.install ...

Django 連線 Mysql 資料庫

django專案要運算元據庫,首先要和資料庫建立連線,才能讓程式中的資料和資料庫關聯起來進行資料的增刪改查操作 django專案預設使用mysqldb模組進行和mysql資料庫之間的互動操作,但是mysqldb模組對於python3.4以上的版本支援還不夠完善,所以我們要使用替代方案通過pymysq...

Django連線資料庫

django作為python的主流web框架之一,擁有像dtl這樣優雅的模板語言,在普通html標籤的基礎上加入了像for標籤還有繼承等後台程式語言才有的東西。同時,django還可以十分便捷地實現資料庫等的連線,可以輕鬆地實現對資料庫的各種操作,使開發過程簡單容易。以下將用django連線mysq...