2011-09-13 5 views
1

데이터베이스 사용 불가능으로 인해 닫힌 jdbc 연결을 복구 할 수 있습니까?jdbc 연결을 복구 할 수 있습니까?

배경을 제공하기 위해 다음과 같은 오류가 발생합니다. 수동 재시동으로 보이지 않습니다. 내 질문에 대한 이유는 그 응용 프로그램이 올바르게 다시 시작하지 않고 행동했다고 들었습니다. 따라서 연결이 끊어진 경우 DB를 다시 시작한 후에 연결을 복구 할 수 있습니까?

은 java.sql.SQLException : ORA-12537 : TNS : 연결이 종료

java.sql.SQLRecoverableException : ORA-01034 : ORACLE을 사용할 수 없습니다 ORA-27101 : 존재하지 않는 공유 메모리 영역 IBM AIX RISC 시스템/6000 오류 : 2 : 그런 파일이나 디렉토리

java.sql.SQLRecoverableException : ORA-01033 : ORACLE 초기화 또는 종료 진행

+0

새 연결을 여는 것과 반대가됩니까? – Marvo

+0

전체 응용 프로그램의 수명 동안 연결을 유지하고 있습니까? 그 나쁜. 가능한 가장 짧은 범위 내에서 열고 닫아야하며, SQL 쿼리를 실행하는 곳과 동일한 메소드 블록 내에서 처리하는 것이 가장 바람직합니다. – BalusC

+0

아니, 그게 아니라면, 그들은 폐쇄되고, 나는 연결 풀을 사용합니다. 로그에서 예외가 발생했으며 무슨 일이 있었는지 암호 해독하려고합니다. 나중에 응용 프로그램이 정상적으로 실행되고 있음을 기억하십시오. 희망이 명확하게. –

답변

3

호 연결이 "죽은"입니다. 새 연결을 만듭니다.

올바른 접근 방법은 connection pool을 사용하는 것입니다.이 방법은 연결하기 전에 정상적으로 연결되는지 테스트하고, 필요한 경우 자동으로 새 연결을 만듭니다.

사용할 오픈 소스 연결 풀이 몇 가지 있습니다. 나는 Apache's JDCP을 사용했고, 그것은 나를 위해 일했습니다.

편집 :
은 (흥미로운 아이디어), 데이터베이스 경우 "잠시 기다렸다가 다시 시도"고 getConnection()의 사용자 지정 버전을 구현할 수 아래의 경우 데이터베이스가 다시 올 때까지 대기 할 점을 감안 응답하지 않습니다.

p.s. 나는이 아이디어를 좋아한다!

+0

질문에 대한 답변을 –

+0

에 추가했습니다. 연결 풀이 도움이되지 않습니다. 개별 데이터베이스 세션이 중단되는 경우에만 도움이됩니다. – steve

0

연결을 복구 할 수 없습니다. 수행 할 수있는 작업은 다른 데이터베이스 인스턴스로의 연결을 장애 조치하는 것입니다. RAC 및 데이터 가드 설치는이 구성을 지원합니다.

읽기 전용 트랜잭션의 경우에는 문제가 없습니다. 그러나 DML을 실행하는 트랜잭션의 경우, 특히 DB에 대한 마지막 호출이 커밋 인 경우 문제가 될 수 있습니다. 커밋의 경우 클라이언트는 커밋 호출이 완료되었는지 여부를 알 수 없습니다. 언제 DB가 실패 했는가? 커밋을 실행하기 전에 또는 커밋을 실행 한 후에 (클라이언트에 응답을 보내지 않음). 응용 프로그램 만이 논리를 가지고 있으며 옳은 일을 할 수 있습니다. 장애 조치 후 응용 프로그램이 마지막 트랜잭션의 상태를 확인하지 않으면 중복 트랜잭션이 가능합니다. 이것은 알려진 문제이며 우리 중 대부분은 티켓이나 유사한 웹 거래를 구매하는 것을 경험했습니다.

관련 문제