2013-10-07 5 views
0

C3P0에 대한 전문가가있어 다음 질문에 답할 수 있기를 바랍니다.C3P0 연결의 건강 검진

첫째, 여기 제가 풀려고하는 일반적인 문제가 있습니다. 우리는 응용 프로그램을 데이터베이스에 연결했습니다. 데이터베이스가 꺼지면 몇 밀리 초와 달리 요청을 처리하는 데 몇 초가 걸립니다. 이는 C3P0이 데이터베이스에 대한 새 연결을 만들려고 시도하기 때문입니다. 결국 제한 시간이 지나면 요청이 거부됩니다.

나는 그것을 고치기위한 제안을 생각해 냈습니다. 풀에서 연결을 잡기 전에 C3P0의 API를 쿼리하여 풀에 연결이 있는지 확인합니다. 아무 것도 없으면 즉시 요청을 취소합니다. 이렇게하면 대기 시간은 시간 초과가 발생할 때까지 기다리지 않고 밀리 초 내에 유지되어야합니다. 이 솔루션은 C3P0이 연결 상태를 감지하면 연결을 제거 할 수 있기 때문에 작동합니다.

이제 "setTestConnectionOnCheckin"및 "setTestConnectionOnCheckout"값을 "false"로 설정하여 테스트를 설정했습니다. 내 이해에 따르면, 이것은 C3P0이 연결을 테스트하지 않을 것이라는 것을 의미합니다 (또는 idleConnectionTestPeriod 설정이 있기 때문에 사용중인 연결을 가정 해 봅니다). 그러나 테스트를 실행할 때 데이터베이스를 종료 한 직후 C3P0이이를 감지하고 풀에서 연결을 제거합니다. 더 명확한 그림을 얻기 위해 실행 결과는 다음과 같습니다.

14:48:01 - 요청이 성공적으로 처리되었습니다. 처리 시간 : 5ms. 14:48:02 - 요청이 성공적으로 처리되었습니다. 처리 시간 : 4ms. 14:48:03 - (이 시점에서 데이터베이스가 종료됩니다.) 14:48:04 - java.net.ConnectException. 14:48:05 - 요청이 거부되었습니다. 처리 시간 : 258 ms. 14:48:06 - 요청이 거부되었습니다. 처리 시간 : 1ms. 14:48:07 - 요청이 거부되었습니다. 처리 시간 : 1ms.

C3P0은 분명히 데이터베이스가 다운되어 풀에서 연결을 제거했다는 것을 알고있었습니다. 아마도 데이터베이스가 종료 된 후 첫 요청이 다른 것들보다 오래 걸렸기 때문에 아마도 시간이 걸렸을 것입니다. 이 테스트를 여러 번 실행했으며 단일 요청은 1ms에서 최대 3.5 초 (시간 초과 시간)까지 걸릴 수 있습니다. 이 항목은 내가 풀에 대해 정의한 연결 수만큼 나타납니다. 나는 나머지를 생략했다.

C3P0이 당장 풀에서 연결을 제거 할 수 있다고 생각합니다. (위의 예에서 258ms로 빠르게)하지만 다른 사람들이 왜 작동하는지 설명하는 데 문제가 있습니다. "setTestConnectionOnCheckin"및 "setTestConnectionOnCheckout"이 "false"로 설정된 경우 C3P0은 연결이 잘못되었음을 알 수 있습니까?

"true"로 설정되어 있어도 연결을 테스트하면 데이터베이스에서 "select 1 + 1 from dual"과 같은 쿼리를 실행하려고 시도합니다. 데이터베이스가 다운되었으므로 테스트 시간이 초과되지 않아야합니까? 즉, 연결이 잘못되었다는 것을 C3P0이 확인하는 데 3.5 초가 걸리지 않습니까?

미리 감사드립니다.

답변

0

(사과 ...이 내가 phonebound 해요, 간결 수 있습니다.)

1) 명시 적 연결 테스트는 구성되지 않은 경우에도, C3P0 테스트 체크 아웃 여부를 결정하는 동안 예외가 발생할 연결 그들은 풀링에 적합합니다.

2) 좋은 JDBC 드라이버는 DBMS를 사용할 수없는 경우 신속하게 예외를 throw합니다. 이러한 내부 연결 테스트가 느려지는 이유는 없습니다.

3) 사용하지 않는 연결을 폴링하지 않고 검사/새 획득을 기다리지 않고 configout 매개 변수 checkoutTimeout을 설정하면됩니다.

행운을 빈다!