0

AWS RDSインスタンスへの接続には、Pythonモジュールmysql.connectorを使用します。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

関数呼び出しは時間がかかりすぎるALARM信号または類似の生成のようないくつかの工夫があります。それらはデータベース接続では扱いにくいか、まったく動作しません。そこにはother SO questionsがあります。

server side timeoutよりも短いことを確認して、接続を作成するときに、connection_timeoutを既知の値に設定する方法があります。接続の年齢を自分で追跡すると、あまりにも古くなる前に先に再接続して以前の接続をクリーンアップすることができます。

また、select now();のようなノーオペレーションクエリを実行して、接続を開いたままにすることもできます。それでも、頻繁に接続をリサイクルしたいと思うでしょう。

しかし、クエリの間隔が長い(有効期限が切れている)場合は、クエリごとに新しい接続を開いてください。

+0

クエリの間隔は固定されていません。時々、我々は短時間で多くのクエリを持っています。そして、時には、5分の間隔があることもあります。あなたが言及したノーオペレーションクエリのアプローチを検討しています。ありがとう! – vishal

関連する問題