0

나는 AWS RDS 인스턴스에 연결하기 위해 파이썬 모듈 mysql.connector을 사용한다.파이썬 mysql.connector 연결 끊기가 30 초 동안 멈춘다.

이제 알다시피 잠시 동안 SQL 서버에 요청을 보내지 않으면 연결이 끊어집니다.

이 문제를 해결하기 위해 읽기/쓰기 요청이 실패한 경우에 대해 SQL에 다시 연결합니다.

이제 내 문제는 "요청이 실패했습니다", 실패하는 것이 중요합니다. 그런 다음 다시 연결하고 요청을 다시 시도 할 수 있습니다. (나는 이것을 코드 스 니펫에서 주석으로 지적했다.)

광산과 같은 실시간 응용 프로그램의 경우 이는 문제입니다. 어떻게 해결할 수 있을까요? 단절이 이미 발생했기 때문에 읽기/쓰기 요청을 기다리지 않고 새로운 연결을 시도 할 수 있는지 확인할 수 있습니까? mysql을 읽는 동안

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 

내 응용 프로그램에서 나는 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이 있습니다.

server side timeout보다 짧게 연결을 만들 때 connection_timeout을 알려진 값으로 설정하는 것이 하나의 방법입니다. 그런 다음 연결의 나이를 직접 추적하면 너무 오래되기 전에 선제 적으로 다시 연결하고 이전 연결을 정리할 수 있습니다.

또는 연결을 계속 유지하기 위해 select now();과 같은 no-op 쿼리를 실행하는 경우가 있습니다. 당신은 여전히 ​​연결을 너무 자주 재활용하고 싶을 것입니다.

그러나 쿼리가 만료 될 수있는 기간이 충분하면 각 쿼리에 대해 새 연결을 열지 않는 이유는 무엇입니까?

+0

쿼리 간격은 고정되어 있지 않습니다. 때때로 우리는 짧은 시간에 많은 질문을합니다. 그리고 때로는 5 분의 간격이있을 수 있습니다. 당신이 언급 한 no-op 쿼리 방식을 고려 중입니다. 감사! – vishal