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
'source' 카테고리의 다른 글
조인된 테이블의 행을 기본 쿼리의 필드 이름 및 값으로 지정하시겠습니까? (0) | 2023.09.01 |
---|---|
CCU가 최대 500개인 애플리케이션에 대해 이 판독값이 괜찮습니까? (0) | 2023.09.01 |
Android에서 EditText를 숫자 값만 허용하도록 설정하려면 어떻게 해야 합니까? (0) | 2023.09.01 |
C와 어셈블리 소스를 혼합하고 cmake로 빌드 (0) | 2023.09.01 |
html 웹 페이지 전체를 에이잭스 응답으로 대체하는 방법은 무엇입니까? (0) | 2023.08.27 |