2011-02-23 1 views
4

Oracle 데이터베이스에 연결된 여러 연결에 걸쳐있는 XA 데이터 소스 및 트랜잭션을 사용하는 JDBC 기반 응용 프로그램이 있습니다. 앱은 공유 DbLink를 사용하여 다른 (Oracle) 서버의 테이블과 조인을 사용하여 일부 쿼리를 작성해야하는 경우가 있습니다. 요청을 너무 자주하지 않으면 작동하지만 4 ~ 5 회의 요청이 계속되면 오류가 발생합니다 (ORA-02020 - 사용중인 링크가 너무 많음). 나는 약간의 연구를했으며, "ALTER SESSION CLOSE DATABASE LINK"라고 부르는 것이 좋습니다. DbLnk 테이블을 조인하는 쿼리 후에이 요청을 호출하면 ORA-2080 오류가 표시됩니다 (링크가 사용 중입니다). 쿼리 전에 호출하면 ORA-2081 (링크가 닫힘)이 표시됩니다. 이 전화는 전혀 도움이됩니까? JDBC 연결은 트랜잭션 커밋 (환경에 따라 서블릿 또는 EJB 컨테이너에 의해 관리 됨)보다 오래 전에 닫힙니다. 연결이 닫히면 Oracle은 링크를 닫힌 것으로 표시하지만 사용 가능한 링크 풀로 돌아가려면 1-2 분이 걸린다는 인상을받습니다. 구성 파일에서 open_links 속성을 사용하여 링크 풀을 확장 할 수 있다는 것을 알고 있지만 더 큰 부하에서 동일한 문제가 발생하지 않는다고 보장하지는 않습니다. dblink가 더 빨리 닫히기 위해 내가 할 수있는 일이 있습니까?ORA-02020 오류를 피하기 위해 XA 데이터 소스 및 트랜잭션을 사용하여 JDBC에서 Oracle DbLinks를 닫을 수 있습니까?

답변

2

분산 된 SQL (선택 항목)은 데이터베이스 링크를 닫기 전에 닫아야하는 트랜잭션을 엽니 다. ALTER SESSION CLOSE DATABASE LINK를 호출하기 전에 롤백하거나 커밋해야합니다.

하지만 거래를 처리하는 다른 항목이 이미있는 것 같습니다. 수동으로 롤백하거나 커밋 할 수없는 경우 열려있는 링크의 수를 늘려야합니다. OPEN_LINKS 매개 변수는 세션 당 최대 링크 수입니다. 필요한 링크의 수는 실제로로드에 의존하지 않으며 별개의 원격 데이터베이스의 최대 수를 기반으로해야합니다.

편집 : 당신이 당신의 의견에 설명하는 상황이 발생하지 않아야

. 거래와 관련하여 실제로 어떤 일이 발생했는지 알기에는 시스템에 대해 충분히 이해하지 못합니다. 어쨌든, 당신은 당신이 대체 이런 절차 "세션 닫기 데이터베이스 링크 변경"할 수 정확히 시스템이 어쩌면 일을 알아낼 수없는 경우 :

: 당신은 아마이 부여가 필요합니다

create or replace procedure rollback_and_close_db_links authid current_user is 
begin 
    rollback; 
    for links in (select db_link from v$dblink) loop 
     execute immediate 'alter session close database link '||links.db_link; 
    end loop; 
end; 
/

grant select on v_$dblink to [relevant user]; 
+0

응답 해 주셔서 감사합니다. 그것은 제가 얻을 수있는 두려운 반응이었습니다. SQL 생성을 처리하는 계층이 트랜잭션을 처리하는 계층과 멀리 떨어져 있기 때문에 고통 스럽지만 어쩌면 닫기 요청을 대기열에 전달하여 커밋 또는 롤백 후에 처리 할 수있는 좋지 않은 방법을 찾을 수 있습니다. 최소한 트랜잭션을 관리하는 컨테이너가 아닌 경우). –

+0

추가 질문 : 트랜잭션이 닫힐 때까지 오라클이 링크를 닫을 수 없다는 것이 문제인 경우 요청 전 링크를 닫는 호출이 실패하는 이유는 무엇입니까? 동일한 거래가 아닙니다. 링크가 이전에 사용되지 않았 으면 분명히 실패해야하지만, 링크가 트랜잭션 A에서 사용되면 커밋 된 다음 1 분 후에 다시 dblink를 사용하기 전에 새 트랜잭션 B에서 링크를 닫으려고합니다. 이유는 무엇입니까? ORA-2081 (링크가 닫혀 있음) 오류가 발생합니까? –

+0

FTI, 그냥 닫기 요청을 대기열에 넣고 커밋이 작동 한 직후에 호출하는지 확인하는 테스트를 실행했습니다. ORA-02081 오류가 발생합니다. –

관련 문제