연결이 잘못되었을 때 JBoss 연결 풀을 Oracle에 다시 연결할 수 있는 방법이 있습니까?
-
02-07-2019 - |
문제
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" />