문제

서버/클라이언트 세트에서 우리는 이상한 행동을 경험하고 있습니다. 클라이언트는 C/C ++-OCI를 사용하여 Oracle 서버에 연결하는 응용 프로그램입니다 (사용 OTL 도서관).

때때로 DB 서버는 어떤 방식 으로든 사망합니다 (예, 이것은 핵심 문제이지만 응용 프로그램 측에서 우리는 그것을 해결할 수는 없지만 어쨌든 그것을 다루어야합니다), 기계는 더 이상 새로운 요청에 응답하지 않습니다. /연결이지만 Oracle-Connections와 같은 기존의 연결은 삭제되거나 시간이 떨어지지 않습니다. DB로 전송 된 쿼리는 더 이상 성공적으로 돌아 오지 않습니다.

Oracle은 클라이언트 응용 프로그램 측면에서 이러한 정체 된 연결을 감지하고 다소 안전한 방식으로 회복 할 수있는 가능성 (있는 경우)은 무엇입니까?

도움이 되었습니까?

해결책

이것은 11.1.0.6까지 Oracle의 버그 (또는 기능이라고 함)이며, 수정이있는 Oracle 11G Release 1 (패치 11.1.0.7)의 패치를 말했습니다. 그것을 볼 필요가 있습니다. 발생하면이 작업을 수행하는 스레드를 취소 (킬)해야합니다. 그래도 좋은 접근법은 아닙니다

다른 팁

모든 DB 스키마에는 하나의 상수 레코드가있는 테이블이 있습니다. 간단한 SQL 요청으로 주기적으로 그러한 테이블을 설문 조사하십시오. 다른 모든 방법은 신뢰할 수 없습니다.

거기에 set_timeout 이에 유용 할 수있는 OTL의 API.

편집 : 사실, 그것을 무시하십시오. set_timeout OCI와 함께 작동하지 않습니다. 살펴보십시오 set_timeout 설명 여기 OCI와 함께 사용할 수있는 기술을 설명합니다.

데이터베이스에 쿼리를 해제 해야하는 것 같습니다 (예 : SELECT * FROM dual;), 데이터베이스가 지정된 시간 내에 응답하지 않은 경우 서버가 죽고 그에 따라 반응했다고 가정합니다. C/C ++를 모르지만 멀티 스레딩을 사용하여 진술을 발사 한 다음 응용 프로그램을 걸지 않고 응답을 기다릴 수 있습니까?

이것은 작동합니다 - 나는 당신이 찾고있는 것을 정확하게했습니다. 부모 절차를 갖습니다 (a) 아동 프로세스 (b). HILD 프로세스 (b)는 데이터베이스에 연결하고 쿼리를 수행합니다 ( "A_Table에서"Select 1 "과 같은 내용 - 이에"듀얼 "을 사용하지 않고 자신의 테이블을 만들면 더 나은 성능을 얻을 수 있습니다). (b)가 성공적이면 그것이 성공했고 종료되었다고 기록합니다. (a) 지정된 시간을 기다리고 있습니다. 15 초를 사용했습니다. (a) (b)가 여전히 실행중인 것을 감지하면 데이터베이스가 매달려 있다고 가정 할 수 있습니다. (b) 죽이고 필요한 조치가 필요합니다 (SMS로 전화로 전화를 걸어).

시간 초과를 사용하도록 SQL*NET을 구성하면 아마도 큰 쿼리가 실패 할 수 있습니다. OCI SET_TIMEOUT 구성도이를 유발합니다.

이것을 피하는 수동 방법이 있습니다. 지정된 기간마다 방화벽을 열고 Ping 데이터베이스와 같은 작업을 수행 할 수 있습니다. 이런 식으로 데이터베이스 연결은 손실되지 않습니다.

아이디어

If (current_time - lastPingTime > configuredPingTime)
{
     //Dummy query
     select 1 from dual;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top