programing

연결이 끊겼을 때 JBoss 연결 풀을 Oracle에 다시 연결할 수 있는 방법이 있습니까?

instargram 2023. 3. 28. 21:13
반응형

연결이 끊겼을 때 JBoss 연결 풀을 Oracle에 다시 연결할 수 있는 방법이 있습니까?

JBoss와 Oracle은 별도의 서버에 배치되어 있습니다.접속이 끊긴 것 같아서 JBoss에서 문제가 발생하고 있습니다.애초에 연결이 끊긴 원인을 파악하는 동안 연결이 잘못된 경우 JBoss를 Oracle에 다시 연결하려면 어떻게 해야 합니까?

오래된 "select 1 from dual" 트릭을 사용할 수 있지만, 이 트릭의 단점은 풀에서 연결을 빌릴 때마다 추가 쿼리를 발행한다는 것입니다.대용량의 경우, 이것은 낭비입니다.

JBoss는 Oracle에서 사용해야 하는 특별한 연결 검증기를 제공합니다.

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

이는 Oracle JDBC Connection 클래스의 자체 ping() 메서드를 사용하고 드라이버의 기본 네트워킹 코드를 사용하여 연결이 아직 활성화되어 있는지 여부를 판단합니다.

그러나 연결이 대여될 때마다 이 작업을 수행하는 것은 여전히 낭비입니다. 따라서 백그라운드 스레드가 풀의 연결을 확인하고 비활성 스레드는 자동으로 폐기하는 기능을 사용할 수 있습니다.이는 훨씬 효율적이지만 연결이 끊어지면 백그라운드 스레드가 검사를 실행하기 전에 연결을 사용하려고 하면 실패합니다.

백그라운드 체크를 설정하는 방법에 대해서는, Wiki 문서를 참조해 주세요.background-validation-millis).

일반적으로 풀에는 검증 쿼리를 대여 시 실행할 수 있는 구성 옵션이 있습니다.검증 쿼리가 정상적으로 실행되면 풀은 해당 연결을 반환합니다.쿼리가 정상적으로 실행되지 않으면 풀에 의해 새로운 연결이 생성됩니다.

JBoss Wiki는 풀의 다양한 속성을 문서화합니다.

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

효과가 있을 것 같네요

코멘트를 하기에는 충분한 평이 없기 때문에, 그것은 대답의 형태로 되어 있습니다.'Select 1 from dual'및 skaffman'sorg.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker접속 체크는 추상화 수준을 제공하지만 method는 동일합니다.트러블 슈팅 연습을 위해 oracle jdbc 드라이버를 디컴파일해야 했습니다.또한 Oracle의 내부 ping 실장은 다음과 같습니다.'Select 'x' from dual'. 나찌.

JBoss는 접속을 검증하는 두 가지 방법을 제공합니다. - ping 기반 AND - Query 기반

필요에 따라 사용할 수 있습니다.이것은 데이터 소스 설정 파일에 정의된 기간에 따라 별도의 스레드로 스케줄 됩니다.

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

Jboss에 올바른 Oracle 드라이버가 없는 경우 클래스캐스트 또는 관련 오류가 발생할 수 있으며 이 경우 연결 풀에서 드롭아웃이 시작될 수 있습니다.ConnectionValidator를 하여 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;
   }
}

@skaffman의 답변에 대한 약간의 업데이트입니다.JBoss 7에서는 유효한 연결 체커를 설정할 때 "class-name" 속성을 사용해야 하며 패키지도 다릅니다.

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

된 오라클에 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>

이 경우 풀에서 접속을 취득할 때 속도가 다소 느려질 수 있습니다.반드시 부하가 걸린 상태에서 테스트해 주세요.

언급URL : https://stackoverflow.com/questions/128527/is-there-any-way-to-have-the-jboss-connection-pool-reconnect-to-oracle-when-conn

반응형