0

Ich benutze Python-Modul mysql.connector für den Anschluss an eine AWS RDS Instanz.Python mysql.connector Schreibfehler beim Verbindungsabbau unterbricht für 30 Sekunden

Nun, wie wir wissen, wenn wir eine Anfrage für eine Weile nicht an SQL Server senden, trennt die Verbindung.

Um dies zu behandeln, stelle ich eine Verbindung zu SQL wieder her, falls eine Lese-/Schreibanforderung fehlschlägt.

Jetzt ist mein Problem mit der "Anfrage fehlgeschlagen", dauert es erheblich zu scheitern. Und nur dann kann ich mich wieder verbinden und meine Anfrage wiederholen. (Ich habe dies als Kommentar im Code-Snippet aufgezeigt).

Für eine Echtzeitanwendung wie meine ist dies ein Problem. Wie könnte ich das lösen? Ist es möglich, herauszufinden, ob die Trennung bereits erfolgt ist, so dass ich eine neue Verbindung versuchen kann, ohne auf eine Lese-/Schreibanforderung warten zu müssen?

Hier ist, wie ich es in meinem Code behandeln jetzt:

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 

In meiner Anwendung kann ich nicht eine Verzögerung von mehr als 1 Sekunde tolerieren, während sie von MySQL zu lesen.
Während MySQL konfigurieren, ich bin gerade dabei die folgenden Einstellungen:

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> 

Antwort

0

Es gibt einige Kniffe wie ein Alarmsignal erzeugt oder ähnlich, wenn ein Funktionsaufruf zu lange dauert. Diese können mit Datenbankverbindungen schwierig sein oder gar nicht funktionieren. Es gibt other SO questions, die dorthin gehen.

Ein Ansatz wäre, den Wert connection_timeout auf einen bekannten Wert zu setzen, wenn Sie die Verbindung erstellen und sicherstellen, dass sie kürzer ist als server side timeout. Wenn Sie das Alter der Verbindung selbst verfolgen, können Sie die Verbindung vorzeitig wiederherstellen, bevor sie zu alt wird und die vorherige Verbindung bereinigen.

Alternativ können Sie gelegentlich eine No-Op-Abfrage wie select now(); ausführen, um die Verbindung offen zu halten. Sie möchten dennoch die Verbindung immer wieder recyceln.

Wenn jedoch lange Zeiträume zwischen Abfragen vorhanden sind (wo sie möglicherweise ablaufen), warum nicht eine neue Verbindung für jede Abfrage öffnen?

+0

Die Zeit zwischen Abfragen ist nicht festgelegt. Manchmal haben wir viele Anfragen in kurzer Zeit. Und manchmal kann es eine Lücke von bis zu 5 Minuten geben. Ich denke über den von Ihnen erwähnten No-Op-Abfrageansatz nach. Vielen Dank! – vishal

Verwandte Themen