CAdoConnection, CDbLogWriter 재연결

CAdoConnection, CDbLogWriter 재연결 관련하여 문의 드립니다.

CAdoConnection
서버에서 DB 접속 후 DB쪽에서 연결이 끊긴 경우에 IsOpened() 가 true 로 찍힙니다. 연결이 끊긴 경우에는 체크가 안되는지, 그리고 DB 쪽에서 연결이 끊긴 경우에는 어떻게 체크해야 하는지 궁금합니다.

CDbLogWriter
서버에서 DB 연결 후 잘 사용하다가 마찬가지로 DB 쪽에서 연결이 끊겼을 때 다시 설정을 해줘야 할 것으로 생각되는데, 연결이 끊겼는지 체크하는 방법이 궁금합니다.

1
ADO는 내부적으로 connection pooling을 하고 있기 때문에 CAdoConnection 객체를 1번만 만들고 계속 사용하지 않으셔도 됩니다. 코드 스니펫처럼 매 DB 요청마다 CAdoConnection 객체를 생성하고, 사용 완료 후 RAII에 의해 처리되도록 하여도 성능 상 문제가 없습니다.
이렇게 매 요청마다 새 객체로 Open 하면 DB와의 연결이 안될 때 Open에서 Proud::AdoException이 발생하게 됩니다. 이러한 방법으로 IsOpened를 이용하시지 않고도 DB와의 연결 해지를 감지하실 수 있습니다. DB와의 연결이 끊겼는데 IsOpened가 true인 문제는 CAdoConnection::IsOpend()의 구현이 다음과 같은데요.

bool CAdoConnection::IsOpend()
{
return ADODB::adStateClosed != GetInterfacePtr()->State;
}`

이 함수 body의 ObjectStaetEnum enum인 adStateClosed와 dll property reference인 State 모두 windows server 2003 r2 standard x64를 기준으로 msado15.tlh 에 구현된 것들로 최신 윈도우 또는 윈도우 서버와 맞지 않는 부분이 있을 수 있습니다.
msado15.tlh 는 프라우드넷 유저 분들께 제공해 드리는 파일로서 설치 경로내 include/x64 폴더에서 확인하실 수 있습니다. 다만 CAdoConnection.IsOpened 문제는 해결에 다소 시간이 걸릴 수 있으니, 앞서 말씀드린 다른 방법을 사용하시는 것을 권합니다.

2
CDbLogWriter의 New 함수를 보시면 두 번째 인자로 ILogWriterDelegate를 넘기는 것을 보실 수 있습니다. 이 ILogWriterDelegate를 상속받는 클래스를 구현하고 그 클래스의 객체를 New 함수로 등록하시면, 그 객체의 OnLogWriterException 콜백을 통해 CDbLogWriter의 각종 에러들을 일괄적으로 받으실 수 있습니다.