Technical Note/SPRING

poolPreparedStatement 속성 정의

DBCP사용시 설정 정보중 <poolPreparedStatement> 란 속성이 있다.
이 속성은 PreparedStatement의 풀 사용 여부를 의미하며, default 값은 "false"이다. 



Prepared Statement Pooling 이란?

statement preparation은 RDBMS의 실행에 있어 비용이 많이 드는 작업이며 복잡한 SQL문일수록 더욱 높은 비용이 소모된다. 
각각의 statement preparation은 문법 오류 검증(syntactical correctness), 컬럼 참조(column references)의 유효성 검증, 최적화된 접근경로와 execution plan의 식별등을 수행한다.

Preparation을 위해서 statement을 매번 RDBMS에서 얻어와야 하는데, 자주 실행되는 Statement를 사전에 Prepare하여 Application이 호출할 수 있는 Common Place(pool)에 저장해 놓는것이 보다 효과적인 방법일 것이다.
이렇게 pool에서 Prepare된 statement을 갖고 오는 방법을 Prepared Statement Pooling 이라고 한다. 

Prepared Statement Pool 생성 매커니즘

  • BasicDataSource 타입의 dataSource 객체에서 Connection 객체를 가져올때 아래의 그림과 같이 두가지의 단계가 수행된다.
    1. Connection Pool이 있다면 Pool에서 Connection을 얻어온다.
    2. PrepareStatement Pool이 생성된다. 이때 Pool 의 크기는 maxOpenPreparedStatements 값에 따라 결정된다. 



  • 얻어온 Connection 객체에서 PrepareStatement 를 수행할 때, PrepareStatement Pool에서 Statement 객체를 얻어온다. 

Prepared Statement Pooling 을 쓰는 이유

다음은 Prepared Statement Pooling을 사용함으로써 얻을 수 있는 이득이다.

  • RDBMS가 Statement를 Prepare하는 시간을 줄일 수 있기 때문에 Application이 RDBMS로부터 데이터를 로딩하는 성능이 향상된다.
  • Statement cashing이 자동으로 수행되므로, Application개발자는 Statement pooling에 관한 지식이 없이도 JDBC Application을 개발할 수 있다.
  • Statement pooling과 Connection pooling을 함께 사용하면 Connection pooling을 단독으로 사용하는 것보다 큰 성능향상을 가져온다.



Prepared Statement Pooling 과 Connection Pool을 함께 사용할 때의 장점

Connection pool을 사용하지 하지 않는 경우 Application이 disconnect 되었을 때 Prepared statement pool 이 사라진다. 
그러나 Connection pool과 Prepared statement pool을 동시에 사용하는 경우, Application이 disconnect 되어 사용하던 Connection이 pool로 return될때, Prepared statement pool도 함께 return 된다. 
그 후, Application이 Connect 했을 때 Statement Preparation을 다시 수행할 필요 없이, Connection에 남아 있는 Prepared statement pool 를 재 사용하게 된다. 

poolPreparedStatement 속성 사용시 주의 사항

  • poolPreparedStatement 속성을 "true"로 설정하였을 경우, 반드시 <maxOpenPreparedStatements> 속성을 함께 사용해 커넥션 당 풀링할 preparedstatement의 적절한 개수를 설정해줘야 한다.
    이 값이 적정하지 않을 경우, 런타임 시 Out of Memory 등의 에러가 발생할 수 있다.

    maxOpenPreparedStatements : 풀의 최대 PreparedStatement 의 개수이며 default는 "unlimited"이다.



poolPreparedStatement 가 성능에 미치는 영향

만약 사용하는 SQL 개수에 비하여 preparedstatement의 Pool의 크기가 작다면, statement를 얻기 위한 비용으로 인해 메모리 사용율이 높아진다. 
반면, Pool의 크기가 크다면 "SQL 길이(statement 객체 크기) * pool 갯수 * connection 갯수" 만큼의 메모리가 쓰여지므로, Out of memory가 발생할 수 있다.
그러므로 적정한 Pool의 크기를 정의해야 성능상 효과를 볼 수 있을 것이다.