0

我使用python模塊mysql.connector連接到AWS RDS實例。python mysql.connector連接斷開連接寫入失敗30秒

現在,正如我們所知,如果我們暫時不向SQL服務器發送請求,連接就會斷開。

爲了處理這個問題,我重新連接到SQL,以防讀/寫請求失敗

現在我的問題與「請求失敗」,它需要很大的失敗。然後才能重新連接,然後重試我的請求。 (我已經指出這是代碼片段中的註釋)。

對於像我這樣的實時應用程序,這是一個問題。我怎麼能解決這個問題?是否有可能找出斷開是否已經發生,以便我可以嘗試新的連接,而無需等待讀/寫請求?

這是我如何處理它在我的代碼現在:

def fetchFromDB(self, vid_id): 
    fetch_query = "SELECT * FROM <db>" 
    success = False 
    attempts = 0 
    output = [] 
    while not success and attempts < self.MAX_CONN_ATTEMPTS: 
     try: 
      if self.cnx == None: 
       self._connectDB_() 

      if self.cnx: 
       cursor = self.cnx.cursor() # MY PROBLEM: This step takes too long to fail in case the connection has expired. 
       cursor.execute(fetch_query) 

       output = [] 
       for entry in cursor: 
        output.append(entry) 
       cursor.close() 
       success = True 
      attempts = attempts + 1 
     except Exception as ex: 
      logging.warning("Error") 
      if self.cnx != None: 
       try: 
        self.cnx.close() 
       except Exception as ex: 
        pass 
       finally: 
        self.cnx = None 
    return output 

在我的應用程序不能同時從MySQL讀書容忍超過1秒的延遲。
雖然配置MySQL,我做的只是進行如下設置:

SQL.user = '<username>' 
SQL.password = '<password>' 
SQL.host = '<AWS RDS HOST>' 
SQL.port = 3306 
SQL.raise_on_warnings = True 
SQL.use_pure = True 
SQL.database = <database-name> 

回答

0

有一樣,如果一個函數調用的時間過長產生報警信號或類似的一些詭計。這些對於數據庫連接來說可能會很棘手,或根本不工作。有去那裏的other SO questions

一種方法是在創建連接時將connection_timeout設置爲已知值,以確保它比server side timeout短。然後,如果您自己追蹤連接的年齡,您可以先搶先重新連接,然後才能過早連接並清理之前的連接。

或者,您可以偶爾執行一個空操作查詢,如select now();以保持連接處於打開狀態。你仍然想要經常回收連接。

但是,如果查詢之間有足夠長的時間間隔(它們可能會到期),爲什麼不爲每個查詢打開一個新的連接呢?

+0

查詢之間的時間不固定。有時候我們很快就會有很多疑問。有時,可能會有5分鐘的差距。我正在考慮你提到的無操作查詢方法。謝謝! – vishal