source

mysql-native 드라이버를 사용하여 DB에 연결한 후 예외 발생

factcode 2023. 9. 1. 21:22
반응형

mysql-native 드라이버를 사용하여 DB에 연결한 후 예외 발생

나는 기능을 만들기를 원합니다.첫 번째는 DB에 연결하는 것이고, 두 번째는 첫 번째가 실패하면 완전히 다시 연결하는 것입니다.

내 실험에서 나는 시작할 때 DB를 끕니다.connect블록이 실패하고 다시 연결 블록을 호출합니다.그 후 DB를 켜고 있고, 연결 블록이 성공할 것으로 기대하고 있지만 예외가 발생하고 있습니다.

내 코드는 다음과 같습니다.

bool connect()
{
    if(connection is null)
    {
        scope(failure) reconnect(); // call reconnect if fail
        this.connection = mydb.lockConnection();
        writeln("connection done");
        return true;
    }
    else
        return false; 

}


void reconnect()
{
    writeln("reconnection block");
    if(connection is null)
    {
        while(!connect) // continue till connection will not be established
        {
            Thread.sleep(3.seconds);
            connectionsAttempts++;
            logError("Connection to DB is not active...");
            logError("Reconnection to DB attempt: %s", connectionsAttempts);
            connect();
        }
    if(connection !is null)
    {
        logWarn("Reconnection to DB server done");
    }

    }

}

로그(몇 초 후 DB 켜기):

reconnection block
reconnection block
connection done
Reconnection to DB server done

object.Exception@C:\Users\Dima\AppData\Roaming\dub\packages\vibe-d-0.7.30\vibe-d\source\vibe\core\drivers\libevent2.d(326): Failed to connect to host 194.87.235.42:3306: Connection timed out [WSAETIMEDOUT ]

다음과 같은 경우에도 예외가 발생하는 이유를 이해할 수 없습니다.Reconnection to DB server done

여기에는 두 가지 주요 문제가 있습니다.

우선, 자동 재시도가 전혀 필요하지 않아야 합니다.처음에는 효과가 없었고, 아무것도 바꾸지 않았다면, 똑같은 정확한 일을 두 번째에는 갑자기 효과가 있을 이유가 없습니다.만약 당신의 네트워크가 그렇게 신뢰할 수 없다면, 당신은 훨씬 더 큰 문제를 갖게 될 것입니다.

두 번째로, 어쨌든 자동으로 재시도할 경우 코드가 작동하지 않습니다.

하나는,reconnect부르는 중connect매번 실패할 때마다 TWICE:연결이 성공했는지 여부에 관계없이 루프 본체의 끝에 한 번, 그리고 바로 다시 루프 상태가 됩니다.그건 아마 당신이 의도한 것이 아닐 겁니다.

그러나 더 중요한 것은 잠재적으로 무한한 재귀가 발생한다는 것입니다.connect호출들reconnect실패할 경우에는그리고나서reconnect호출들connect최대 6회, 각 회connect호출들reconnect다시 장애가 발생하면 어떻게든 작동하지 않는 연결 구성이 마법처럼 작동하기 시작할 때까지(또는 스택을 풀고 충돌할 때까지) 계속 루프합니다.

솔직히, 저는 그것을 그냥 버리는 것을 추천합니다: 그냥 전화하세요.lockConnection(vibe.d를 사용하는 경우) 또는new Connection(...)(vibe.d를 사용하지 않는 경우) 종료합니다.연결 설정이 잘못된 경우 동일한 연결 설정을 다시 시도해도 문제가 해결되지 않습니다.

lockConnection -- 일치하는 "잠금 해제"가 있어야 합니까?릭 제임스

아니요, 문제의 연결 풀은 vibe.d에서 왔습니다.연결을 잠근 파이버가 종료되면(일반적으로 "서버에서 요청 처리가 완료되었을 때"를 의미함) 파이버가 잠긴 모든 연결이 자동으로 풀로 반환됩니다.

언급URL : https://stackoverflow.com/questions/42180991/exception-after-connection-to-db-with-mysql-native-driver

반응형