문제

나는 일부 소스에서 데이터를 지속적으로 추출하여 데이터베이스에 쓰는 프로그램에 C3P0과 함께 Hibernate 3을 사용하고 있습니다. 이제 문제는 데이터베이스를 몇 가지 이유로 사용할 수 없게 될 수 있다는 것입니다 (가장 간단한 경우 : 간단히 종료).

데이터베이스에 서면으로 작성하려면 예외가 없어야합니다. 쿼리는 데이터베이스가 다시 사용할 수있을 때까지 모든 영원을 기다려야합니다. 내가 착각하지 않았다면 이것은 연결 풀이 나를 위해 할 수있는 일 중 하나입니다. DB에 문제가있는 경우, 최악의 경우 연결에 다시 시도하십시오.

그러나 대신 파이프 예외가 깨지고 때로는 연결 거부가 거부 된 다음 예외가 내 코드로 전달됩니다.

예외를 포착하더라도 어떻게 최대 절전 모드를 다시 깨끗하게 재 구선 할 수 있습니까? (지금까지 C3P0이 없으면 나는 단순히 세션 공장을 다시 만들었지 만 연결이 누출 될 수 있다면 놀라지 않을 것입니다 (또는 그렇게해도 괜찮습니까?).

데이터베이스는 Virtuoso 오픈 소스 에디션입니다.

내 hibernate.xml.cfg c3p0 config :

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>  
<property name="hibernate.c3p0.breakAfterAcquireFailure">false</property>
<property name="hibernate.c3p0.acquireRetryAttempts">-1</property>
<property name="hibernate.c3p0.acquireRetryDelay">30000</property>
<property name="hibernate.c3p0.automaticTestTable">my_test_table</property>

<property name="hibernate.c3p0.initialPoolSize">3</property>
<property name="hibernate.c3p0.minPoolSize">3</property>
<property name="hibernate.c3p0.maxPoolSize">10</property>

BTW : 테스트 테이블이 생성되고 수많은 디버그 출력이 발생하므로 실제로 구성을 읽는 것 같습니다.

도움이 되었습니까?

해결책

Bonecp가 실제로 이것을 구현 한 것 같습니다. 트랜잭션을 기록하고 네트워크 또는 데이터베이스 실패시 트랜잭션을 재생하도록 설정할 수 있습니다.

http://jolbox.com/bonecp/downloads/site/apidocs/com/jolbox/bonecp/bonecpconfig.html#settransactionRecoveryEnabled (boolean)

다른 팁

내가 착각하지 않았다면 이것은 연결 풀이 나를 위해 할 수있는 일 중 하나입니다. DB에 문제가있는 경우, 최악의 경우 연결에 다시 시도하십시오.

당신은 착각합니다. 연결 풀은 단지 ... 연결 풀입니다. 데이터베이스에 이미 확립 된 물리적 연결이 포함되어 있으며 그 중 하나가 필요할 때 이러한 연결을 생성하는 오버 헤드를 피하는 데 사용됩니다.

즉, 이러한 연결은 오래 될 수 있습니다 (예 : 데이터베이스를 다시 시작하면). 운 좋게도 대부분의 연결 풀은 연결이 여전히 유효한지 테스트하고 배포하기 전에 갱신하기 위해 구성 할 수 있습니다. C3P0은 문서화 된 대로이 기능을 지원합니다 연결 테스트 구성 그리고 당신은 실제로 이미 다양한 옵션 중 하나를 사용하고 있습니다. 따라서 데이터베이스가 돌아 오면 연결을 갱신해야합니다.

그러나 데이터베이스가 다운 될 때 응용 프로그램이 마술처럼 매달릴 것으로 기대하지 마십시오. 풀에서는이 작업을 수행하지 않습니다.

답변 주셔서 감사합니다. 섹션의 마지막 단락을 실제로 이해하지 못한 것 같습니다.http://www.mchange.com/projects/c3p0/index.html#configuring_recovery

처음에는 C3P0이 수행 할 수있는 것으로 보입니다 (부실한 연결을 감지하고 응용 프로그램 코드에 대한 예외를 제외하지 않고 영원의 연결을 획득하기 위해 재 시도합니다 (물론 오류가 연결이 아닌 SQL 문과 관련된 경우). 그러나 마지막 단락에서 꽤 혼란스러운 방식으로 작성된 것은 C3P0이 100%로 보장 할 수없는 것처럼 보입니다.

따라서 내 솔루션은 JDBC 연결 인터페이스에서 필요한 메소드에 대한 작은 래퍼를 만드는 것이 었습니다. 연결 오류로 인해 쿼리가 실패한 경우 다시 연결하려고합니다. 물론 약간은 해킹됩니다. 오히려 내 구성 요소가 내 인터페이스 대신 표준 연결 인터페이스를 사용하지만 적어도 지금은 깨끗하게 작동하기 때문입니다.

당신은 잊고 있습니다 :

  • 시작된 거래는 어떻습니까?
  • 이미 DB로 전송 된 준비된 상태는 어떻습니까?

따라서 신청서는 거래를 다시 시작해야합니다. 내가 생각할 수있는 유일한 방법은 연결 풀이 연결 핸들로의 모든 호출을 추적하고 오류가 발생한 경우 재생하는 것입니다. 그러나 이것은 연결 풀의 속도를 크게 느리게합니다.

Bonecp의 경우 (http://jolbox.com), 풀은 JDBC 드라이버가 먼저 던진 예외를 잡고 해당 연결을 결함으로 표시하거나 전체 연결 풀을 재현하여 처리하여 처리하여 실패를 감지합니다.

편집 : 지금 처리 중입니다.

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