工作中純服務端的專案用到了執行緒池和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...