2014-06-24 8 views
0

의 연결 풀에 연결 풀에 문제가 있습니다. jconn3 (com.sybase.jdbc3)을 사용하여 Glassfish 3.1.2.2를 실행하여 Sybase 12.5에 연결합니다. 우리 조직에는 야간 재부팅 프로세스가 있으며,이 프로세스 동안 Sybase 서버를 다시 시작합니다. 재부팅 중에 데이터베이스 연결을 사용하려고하면 내 문제가 발생합니다. 다음은 문제를 해결하기위한 작업 순서입니다.JDBC 연결 풀로 반환 된 연결 해제 - Glassfish 3.1.2.2

  • Sybase가 다시 시작될 때 다운되었습니다.
  • 풀에서 연결을 요청합니다.
  • DB 작업이 예상대로 실패합니다.
  • 연결이 닫힌 상태에서 풀로 반환됩니다.
  • Sybase가 백업되었습니다.
  • 풀에서 연결을 요청합니다.
  • "연결이 이미 닫혔습니다"예외로 인해 DB 작업이 실패합니다.
  • 연결이 풀로 반환됩니다.
  • 이 시나리오에서 복구를 시도하는 데이터베이스 복구 단독 기능을 구현했습니다. 데이터베이스 예외가 발생할 때마다 모든 대기열을 일시 중지하고 JDBC 연결 풀에서 flushConnectionPool 작업을 실행하는 jmx 호출을 수행합니다. 데이터베이스 연결이 여전히 작동하지 않으면 프로세스가 10 분 후에 재 시도하도록 타이머를 설정합니다. 이 프로세스가 작동하는 동안 결함이있는 것은 아닙니다.

    풀에 설정이있어서 데이터베이스 연결에 대한 유효성 검사를 요구할 수 있다는 것을 알고 있지만 성능상의 이유로 여기에서 벗어났습니다. 내 프로세스는 하루에 약 5 백만 건의 데이터베이스 트랜잭션을 수행합니다.

    제 질문은, 처음에는 연결이 끊긴 연결을 다시 풀지 않도록하는 방법을 알고 있습니까?

    답변

    1

    당신은 당신의 선택을 아주 잘 요약했습니다. 우리는 자정 DB가 다운되는 문제를 안고있었습니다. 우리는 연결 검증을 설정했지만 거래량은 없습니다.

    글래스 피시는 유효성 검사를 수행하도록 클래스를 지정할 수있는 사용자 지정 유효성 검사 옵션을 제공합니다.

    SELECT 1; 
    

    이 구문은 데이터베이스 사이에 약간의 변화, SQL :

    기본적으로 글래스 피시에서 제공하는 모든 클래스는이 같은 SQL 문이 (당신은 그들 콘솔에서 옵션으로 제공 볼 수 있습니다) 않습니다 서버는 '1'을 사용하지만, 포스트그레스의 경우 1을 사용합니다.하지만 의도는 같습니다.

    인터넷을 사용하면 연결을 시도 할 때마다 추가 DB에 비용이 들지만 실제로는 정말 저렴합니다. 하지만 여전히 히트작입니다.

    하지만 자신 만의 버전을 구현할 수 있습니다. 예를 들어 매 10 번째 요청마다 또는 더 적은 빈도로 확인을 수행 할 수 있습니다. 1에서 N까지 (N = 10, 20, 100 ...) 임의의 숫자를 굴려 '1'을 얻으면 선택을하고 그렇지 않으면 실패합니다. 그렇지 않으면 'true'를 반환합니다. 그러나 동시에 오류를 감지하면 전체 풀을 제거하도록 구성하십시오. 분명히 이것을 조정하면 db가 밤에 다운 될 때 일어날 수있는 좋은 기회가됩니다 (시스템이 밤에 얼마나 바쁠 까?) 최고 처리 대.

    피크 처리 중에도 "가능성을 낮출 수 있습니다". "오전 6 시부 터 오후 6 시까 지이면 확률 = 1000 else 확률 = 100; if (랜덤 (오즈) == 1) {do select ...}"

    무작위 옵션을 사용하면 스레드 안전 카운터 .

    결국 중요한 것은 아닙니다. DB가 다운되어 있으므로 GF에게 풀을 중단하도록 요청할 수 있습니다.

    DB가 올라 오면서 수영장이 한 번 이상 새로 고쳐지기 때문에 처음부터 약간의 타격을 볼 수 있지만 무해해야합니다.

    당신이 그걸 가지고 놀 수있는 방법은 다양하지만 고려해야 할 길입니다.