python mysql斷開重連

2021-08-10 03:34:54 字數 3043 閱讀 1618

後台服務在執行時發現乙個問題,執行約15分鐘後,介面請求報錯

pymysql.err.inte***ceerror: (0, '')
這個錯誤提示一般發生在將none賦給多個值,定位問題時發現

pymysql.err.operationalerror: (2013, 'lost connection to mysql server during query')
如何解決這個問題呢

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()

在分析問題前,先看看python 資料庫的connection、cursor兩大物件

connection、cursor形象比喻

用於執行查詢和獲取結果

execute方法:執行sql,將結果從資料庫獲取到客戶端

除錯**,將超時時間設定較長

self.connection._write_timeout = 10000
發現並沒有生效

使用try...except...方法捕獲失敗後重新連線資料庫

try:

self.cursor.execute(sql)

except:

self.connection()

self.cursor.execute(sql)

直接丟擲異常,並沒有執行except**段

列印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

在每次請求資料庫前執行如下**

def reconnect(self):

try:

self.connection.ping()

except:

self.connection()

不過這樣的方式雖然能解決問題,但是感覺相對較low,希望有更好的處理方法

目前已實現的資料庫查詢這部分的**

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 導致無法傳送資料報,如何處理呢?主...