연결이 잘못되었을 때 JBoss 연결 풀을 Oracle에 다시 연결할 수 있는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/128527

문제

JBoss와 Oracle은 별도의 서버에 있습니다.연결이 끊어진 것 같으며 JBoss에 문제를 일으키는 것 같습니다.처음에 연결이 끊어지는 이유를 파악하는 동안 연결이 불량한 경우 JBoss를 Oracle에 다시 연결하려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

풀에는 일반적으로 빌리어에서 유효성 검사 쿼리를 실행할 수 있도록 구성 옵션이 있습니다. 유효성 검사 쿼리가 성공적으로 실행되면 풀이 해당 연결을 반환합니다. 쿼리가 성공적으로 실행되지 않으면 풀이 새 연결을 만듭니다.

그만큼 Jboss Wiki 수영장의 다양한 속성을 문서화합니다.

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>

트릭을 수행 해야하는 것 같습니다.

다른 팁

이전의 "이중에서 1 선택" 트릭을 사용할 수 있지만 이 방법의 단점은 풀에서 연결을 빌릴 때마다 추가 쿼리를 실행한다는 것입니다.대용량의 경우 이는 낭비입니다.

JBoss는 Oracle에 사용해야 하는 특수 연결 유효성 검사기를 제공합니다.

<valid-connection-checker-class-name>
    org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
</valid-connection-checker-class-name>

이는 Oracle JDBC 연결 클래스의 고유한 ping() 메서드를 사용하고 드라이버의 기본 네트워킹 코드를 사용하여 연결이 여전히 활성 상태인지 확인합니다.

그러나 연결을 빌릴 때마다 이를 실행하는 것은 여전히 ​​낭비이므로 백그라운드 스레드가 풀의 연결을 확인하고 죽은 연결을 자동으로 삭제하는 기능을 사용하는 것이 좋습니다.이는 훨씬 더 효율적이지만 연결이 하다 죽으면 백그라운드 스레드가 검사를 실행하기 전에 이를 사용하려는 시도는 실패합니다.

참조 위키 문서 백그라운드 확인을 구성하는 방법은 다음을 참조하세요. background-validation-millis).

의견에 대한 담당자가 충분하지 않으므로 대답의 형태입니다. 그만큼 'Select 1 from dual' 그리고 Skaffman 's org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker 연결 검사는 추상화 수준을 제공하지만 메소드는 동일합니다. 우리는 문제 해결 연습을 위해 Oracle JDBC 드라이버를 디코딩해야했으며 Oracle의 내부 구현은 'Select 'x' from dual'. natch.

JBoss는 연결을 검증하는 두 가지 방법을 제공합니다. - 핑 기반 및 - 쿼리 기반

요구 사항에 따라 사용할 수 있습니다. 데이터 소스 구성 파일에 정의 된 지속 시간에 따라 별도의 스레드로 예약됩니다.

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes>

JBoss에 올바른 Oracle 드라이버가 없으면 클래스 캐스트 또는 관련 오류가 발생할 수 있으며 해당 연결이 연결 풀에서 중퇴를 시작할 수 있습니다. 구현하여 자신만의 ConnectionValidator 클래스를 만들 수 있습니다. org.jboss.resource.adapter.jdbc.ValidConnectionChecker 상호 작용. 이 인터페이스는 단일 방법 만 제공합니다. 'isValidConnection()유효한 연결에 대한 대가로 '널'을 기대합니다.

전:

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable {

   private Method ping;

   // The timeout (apparently the timeout is ignored?)
   private static Object[] params = new Object[] { new Integer(5000) };

   public SQLException isValidConnection(Connection c) {

       try {
           Integer status = (Integer) ping.invoke(c, params);

           if (status.intValue() < 0) {
               return new SQLException("pingDatabase failed status=" + status);
           }

       }
       catch (Exception e) {
           log.warn("Unexpected error in pingDatabase", e);
       }

       // OK
       return null;
   }
}

우리는 최근 고아 오라클로 인한 부동 요청 처리 실패가있었습니다. DBMS_LOCK 클라이언트 측 연결 풀에서 무기한 유지 된 세션 잠금.

따라서 30 분 안에 세션이 만료되지만 응용 프로그램 운영에는 영향을 미치지 않는 솔루션이 있습니다.

<check-valid-connection-sql>select case when 30/60/24 > sysdate-LOGON_TIME then 1 else 1/0 end 
from V$SESSION where AUDSID = userenv('SESSIONID')</check-valid-connection-sql>

여기에는 풀에서 연결을 얻는 과정에서 약간의 느려질 수 있습니다. 부하에서 테스트하십시오.

@skaffman의 답변에 대한 약간의 업데이트. JBOSS 7에서 유효한 연결 검사기를 설정할 때 "클래스 이름"속성을 사용해야하며 패키지도 다릅니다.

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top