1 2 3 4 |
################################# Exception ############################# org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:103) at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540) |
위와 같은 증상에선..테스트 소스는 별 의미가 없습니다.
리소스(Connection)가 어디서 새는지 해당 소스를 찾아내시는 방법밖에 없습니다. 리뷰할 소스가 방대하고 성능관리 툴이 없는 상황이시라면 정말 위로의 말씀을 전해드리고 싶군요..ㅠ.ㅜ
그나마 일단 시도해 볼 수 있는 방법은 이렇습니다.
서비스에 지장이 없는 시간이라면 커넥션 갯수를 하나로 셋팅 하시고 화면으로 테스트 하는 방법입니다.
예를들면 브라우저를 두개 띄워놓으시고 스타트할 화면을 양쪽에 똑같이 잡으시고 한번씩 클릭하면서 먼저 호출된 페이지를 한쪽 브라우저에서 따라가는 겁니다.
즉. 하나의 소스를 두번씩 호출해서 테스트하는거죠. 커넥션은 하나이니 문제가 있는 화면에서 걸리겠죠.. 소스리뷰하는것 보다는 낳을듯 싶네요.
이렇게 설정하면 야기될 수 있는 문제점은
1. maxWait 시간이 너무 작습니다
이는 가끔씩 Connection 획득 실패가 날 수 있습니다
아래와 같은 에러를 내면서…
java.sql.SQLException: DBCP could not obtain an idle db connection, pool exhausted
1-1. 어떤 이유로 JVM의 GC가 일어난다 ( 웹서버의 모든 성능이 저하됨 )
1-2. 그러는 동안 어떤 넘이 새로운 Connection을 얻으려 한다
1-3. pool에 사용가능한 Connection이 없어 새로운 Connection 객체를 생성하려 한다( GC 중이기 땜시 시간이 꽤 걸린다 -> 내부적으로 pool을 block하고 maxWait 후 Connection을 다시 얻으려 시도한다)
1-4. 그런데 maxWait 가 너무 짧아 객체 생성 전에 block이 풀린다
1-5. 그러나 사용가능한 Connection이 없다 ( GC영향으로Connection이 아직 생성이 안되었으므로… )
1-6. 위와 같은 Exception을 throw 합니다
그래서 Commons에서는 maxWait를 10000~15000을 권장합니다