2014-03-28 3 views
0

내 DAO에서 세션에서 트랜잭션을 생성해야하기 전에 풀을 모두 소진했는지 알고 싶기 때문에 유용합니다.Hibernate SessionFactory checkout 만드는 법 세션 열기시 c3p0에서 JDBC 커넥션?

사용자에게 시스템 과부하 (풀 고갈)에 대한 피드백을 보내고 싶지만 모든 DAO의 모든 메소드에서이 특정 예외를 포착하고 싶지는 않습니다. 저는 세션 열기가 이것을 확인하는 적절한시기라고 생각합니다.

답변

0

최신 버전이 데이터베이스 연결 속성이 있습니다

hibernate.connection.acquisition_mode 

즉시 로 설정 될 수있다, 따라서

을 "연결이 즉시 절전 모드 세션이 그대로 인수한다 이 열리 며 Connection 은 세션이 닫힐 때까지 계속 유지되므로 ConnectionReleaseMode도 우회합니다. "

1

Hibernate는 가능한 한 짧은 데이터베이스 연결을 사용하는 것이 가장 좋습니다. 세션이 열렸을 때 데이터베이스 연결을 요구하면이 작업이 수행됩니다 (수행 할 수있는 쿼리가 없으며 나중에 나옵니다). 부작용은 수영장이 훨씬 빨리 소모된다는 것입니다.

c3p0은 checkoutTimeout을 사용하여 풀을 모두 사용할 때 연결을 사용할 수있게 될 때까지 대기하는 시간을 결정합니다. 기본적으로이 시간 초과는 0 (즉, 제한 시간 없음)이지만 다른 값 (예 : 50 000 밀리 초)으로 설정되고 시간 초과에 도달하면 SQLException이 발생합니다.

트랜잭션을 시작하기 전에 checkoutTimeout에 도달했는지 확인하기 위해 시도 할 수 있지만 항상 다른 트랜잭션이 완료되는 속도에 따라 다릅니다.
추측을 위해서는 c3p0의 JMX interface을 사용하고 연결 수 (NumConnections), 연결 사용 수 (NumBusyConnections) 및 연결 대기중인 스레드 수 (NumThreadsAwaitingCheckout)에 대한 값을 얻을 수 있습니다.
많은 통화 연결이 있고 많은 스레드가 대기중인 경우 checkoutTimeout에 도달 할 가능성이 있지만 스트레스 테스트를 통해 정확한 숫자를 결정해야합니다. 최대 절전 모드의