後台服務在執行時發現乙個問題,執行約15分鐘後,介面請求報錯
pymysql.err.inte***ceerror: (0, '')
這個錯誤提示一般發生在將none賦給多個值,定位問題時發現
pymysql.err.operationalerror: (2013, 'lost connection to mysql server during query')
如何解決這個問題呢
在分析問題前,先看看python 資料庫的connection、cursor兩大物件class mysqlconnection(object):
"""mysql操作類,對mysql資料庫進行增刪改查
"""def __init__(self, config):
# connect to the database
self.connection = pymysql.connect(**config)
self.cursor = self.connection.cursor()
def query(self, sql):
"""查詢資料
:param sql:
:return:
"""self.cursor.execute(sql)
return self.cursor.fetchall()
connection、cursor形象比喻
用於執行查詢和獲取結果
execute方法:執行sql,將結果從資料庫獲取到客戶端
除錯**,將超時時間設定較長
self.connection._write_timeout = 10000
發現並沒有生效
使用try...except...
方法捕獲失敗後重新連線資料庫
直接丟擲異常,並沒有執行except**段try:
self.cursor.execute(sql)
except:
self.connection()
self.cursor.execute(sql)
列印self.connection
,輸出如下:
丟擲異常重新connect是不行的,因為connections
仍存在未失效
找到一種方法可以解決問題,在每次連線之前,判斷該鏈結是否有效,pymysql提供的介面是connection.ping()
這個該方法的原始碼
在每次請求資料庫前執行如下**def ping(self, reconnect=true):
"""check if the server is alive"""
if self._sock is none:
if reconnect:
self.connect()
reconnect = false
else:
raise err.error("already closed")
try:
self._execute_command(command.com_ping, "")
return self._read_ok_packet()
except exception:
if reconnect:
self.connect()
return self.ping(false)
else:
raise
不過這樣的方式雖然能解決問題,但是感覺相對較low,希望有更好的處理方法def reconnect(self):
try:
self.connection.ping()
except:
self.connection()
目前已實現的資料庫查詢這部分的**
import pymysql
class dbmanager(object):
def __init__(self,config):
self.connection = pymysql.connect(**config) # config為資料庫登入驗證配置資訊
self.cursor = self.connection.cursor()
def query(self, sql, params):
try:
with self.connection.cursor() as cursor:
cursor.execute(sql, params)
result = cursor.fetchall()
self.connection.commit()
return result
# self.connection.close()
except exception as e:
traceback.print_exc()
TCP斷開重連
在tcp協議中,對於斷開的一方其本地用來通訊的埠 系統分配的 仍然會被保留一段時間。所以客戶端斷開後立即再連就是失敗。解決的途徑就是換乙個本地的通訊埠,由於不能手動指定乙個新埠那就只能重新建立tcpclient例項。在重新建立tcpclient之前要釋放掉原tcpclient所占有的資源。c usi...
kafka mqtt 斷開重連問題
kafka mqtt 和spring 整合後自身都有重連機制的,分兩種情況進行解釋 1 專案啟動時候連線不上伺服器 2 專案啟動成功後伺服器斷開連線 1 mqtt 1和2中情況類似,專案都能啟動成功,重要的是,訂閱和發布的區別,訂閱的重接機制依託於心跳,可以設定心跳間隔,預設10s,而發布沒有心跳機...
關於C Socket斷開重連問題
tcp客戶端可以向 tcpserver 傳送資料報時,若網路斷開,原來的連線就會失效,出現以下錯誤提示 斷開套接字連線後,只能通過非同步方式再次重新連線,而且只能連線到不同的 endpoint。在操作完成前,在將不會退出的執行緒上必須呼叫 beginconnect 導致無法傳送資料報,如何處理呢?主...