2013-10-07 2 views
0

jsp에서 저장 프로 시저를 호출하는 tomcat 서버가 있습니다. 저장 프로 시저에서 데이터가있는 임시 테이블을 채우는 쿼리가 있습니다. 그런 다음 임시 테이블은 힌트 -을 사용하여 다른 임시 테이블을 채우기 위해 dblink를 통해 다른 테이블에 조인됩니다. 마지막 임시 테이블은 데이터베이스의 다른 테이블에 조인되어 결과 집합을 Tomcat에 반환합니다.데이터베이스 연결 연결 시간이 초과되었습니다.

죄송 합니다만이 모든 코드 예제를 제공 할 수는 없지만 내가 가지고있는 문제는 다음과 같습니다. - 데이터베이스 링크를 사용하지 않고 잠시 후에 링크를 사용하여 만든 첫 번째 쿼리 아무것도하지 않고 오류를 반환합니다.

test.jsp caught exception, closing connection: ORA-02068: following severe error from DATABASE_LINK_NAME 
ORA-03135: connection lost contact 

마지막 호출에서 10 분 정도 후에 데이터베이스 링크에서 수행되는 모든 쿼리는 문제가되지 않습니다. 임시 테이블이 크거나 작을 수 있지만 쿼리 된 데이터 양은 아무런 차이가없는 것으로 보입니다. 유휴 시간이 지나면 첫 번째 호출에서이 오류가 발생할 확률은 아마 75 %입니다. 누구든지이 문제를 경험 했습니까? 그렇다면 해결 방법이 있습니까?

쿼리과 같이 구성되어있다 :

INSERT INTO temp_table_2 
WITH last_submissions AS (
    SELECT /*+ DRIVING_SITE(some_schema.some_table_1) */ 
      bs.unique_id, 
      CASE WHEN COUNT(bs.unique_id) > 1 THEN 'Y' ELSE 'N' END some_flag, 
      MAX(trx.unique_id) last_submission 
    FROM (SELECT unique_id 
      FROM temp_table_1) oids, 
      [email protected]_LINK bs, 
      [email protected]_LINK trx 
    WHERE oids.unique_id = bs.unique_id 
     AND bs.non_unique_join_id = trx.non_unique_join_id 
    GROUP BY bs.unique_id), 
something_relevant AS (
    SELECT /*+ DRIVING_SITE(some_schema.some_table_2) */ 
      last_value_of_something.unique_id, 
      last_value_of_something.some_flag, 
      mv.value_description status 
    FROM (
     SELECT /*+ DRIVING_SITE(some_schema.some_table_1) */ 
       ls.unique_id, 
       CASE WHEN COUNT(ls.unique_id) > 1 THEN 'Y' ELSE 'N' END some_flag, 
       MAX(prd.prd_some_id) last_submission 
     FROM last_submissions ls, 
       [email protected]_LINK trx, 
       [email protected]_LINK prd 
     WHERE ls.last_submission = trx.unique_id 
      AND trx.some_unique_id = prd.some_unique_id (+) 
     GROUP BY ls.unique_id) last_value_of_something, 
     [email protected]_LINK prd, 
     [email protected]_LINK cs, 
     [email protected]_LINK mv 
    WHERE last_value_of_something.last_submission = prd.prd_some_id (+) 
     AND prd.some_id = cs.some_id (+) 
     AND cs.status_code = mv.value (+) 
     AND mv.value_type (+) = 'SOME_INDICATOR_FOR_DISPLAY_VALUES') 
SELECT ls.unique_id unique_id, 
     NVL(pr.status, trx.some_code) status, 
     CASE WHEN ls.some_flag = 'Y' OR pr.some_flag = 'Y' THEN 'Yes' ELSE 'No' END display_the_flag 
FROM /*+ DRIVING_SITE(some_schema.some_table_1) */ 
     last_submissions ls, 
     [email protected]_LINK trx, 
     something_relevant pr 
WHERE ls.last_submission = trx.unique_id 
    AND ls.unique_id = pr.unique_id 
+1

유휴 기간 후에 연결을 끊는 두 데이터베이스 사이에 방화벽이 있습니까? 10 분 후에있을 것 같네요. 네트워크 오히려 오히려 오히려 오히려보다는 오히려 어쨌든, 같이 소리가 난다. –

답변

2

당신은 두 개의 데이터베이스 서버 사이의 네트워크 안정하고 연결이 얼마 동안 존재 할 수 있도록 기대합니까?

데이터베이스 링크를 사용하면 로컬 서버가 원격 서버에 대한 연결을 엽니 다. 세션이 다른 쿼리에서 사용하도록 열려있는 한 그 연결은 열린 상태로 유지됩니다. 연결이 끊어지는 것을 보는 경우, 유휴 연결을 감지하고 종료시키는 무언가가 네트워크 (일반적으로 방화벽)에 있음을 의미합니다. 또한 두 서버 간의 네트워크가 불안정하다는 것을 의미 할 수도 있습니다.

이상적인 네트워크 문제를 해결하면 문제를 해결할 수 있습니다. 유휴 연결을 종료하는 방화벽이있는 경우 방화벽 구성을 수정하여 이러한 연결이 끊어지지 않도록해야합니다.

인프라를 수정하는 옵션이없는 경우, 당신은 모든 쿼리 후 원격 서버로의 연결을 닫습니다 (또는 적어도 긴 유휴 시간 다음에 할 수있는 모든 쿼리 후)

ALTER SESSION CLOSE DATABASE LINK <<dblink name>> 

수 그러나 잠재적으로 상대적으로 비용이 많이 들고 원격 서버에 더 많은 부하를 유발할 수있는 잠재적 인 모든 쿼리에서 원격 서버에 대한 연결을 설정하고 끊는다는 것을 의미합니다 (물론 얼마나 자주 발생하는지에 따라 다름) 얼마나 많은 세션이 있을지).

웹 응용 프로그램을 사용하여 사람에게 데이터를 제공하기 위해 데이터베이스 링크를 통해 일련의 임시 테이블로 데이터를 가져 오는 프로세스 전체가 잠재적으로 문제가되는 아키텍처로 생각납니다. 아마 당신은 이것에 대한 타당한 이유가있을 것입니다. 그러나 필자는 데이터베이스 링크를 통해 런타임에 데이터를 가져 오는 대신 일종의 복제 기술 (구체화 된 뷰, Streams 또는 GoldenGate가 기본 제공 옵션)을 사용할 것을 강력히 고려할 것입니다.

+0

@Reimius - JDBC/ODBC 드라이버를 통해 중간 계층에서 각 데이터베이스에 연결할 수 있다는 사실은 서버 간의 연결이 일종의 방화벽에 의해 종료되지 않는다는 것을 의미하지는 않습니다. –

+0

@Justin_Cave 다른 모든 링크 쿼리가 작동하는 데는 약간의 의미가 있습니다. – Reimius

+0

@Reimius - 동일한 세션에서 쿼리간에 유휴 시간이 비슷한 경우 예를 들어 작동하는 다른 쿼리의 의미가 있습니다. 그러나 N 분 후에 연결을 종료하는 방화벽이있을 수 있습니다. N 분 후에는 단시간에 실행되는 여러 프로세스에 문제가 발생하지 않지만 N 분 이내에 실행되지만 종종 실행되는 프로세스에 문제가 발생합니다. 조금 깁니다. 마지막 단락만으로는 당신이 묻는 질문에 정말로 답이되지 않아서 다른 모든 것을 제거 할 수 없습니다. 기꺼이 자신의 대답을 수락하십시오. –

관련 문제