연결 풀 또는 커넥션 풀(connection pool)은 소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다. 연결 풀을 사용하면 데이터베이스의 명령 실행의 성능을 강화할 수 있다. 각 사용자마다 데이터베이스 연결을 열고 유지 보수하는 것은 비용이 많이 들고 자원을 낭비한다. 연결 풀의 경우 연결이 수립된 이후에 풀에 위치해 있으므로 다시 사용하면 새로운 연결을 수립할 필요가 없어진다. 모든 연결이 사용 중이면 새로운 연결을 만들고 풀에 추가된다. 연결 풀은 사용자가 데이터베이스에 연결을 수립하는 데까지 대기해야 하는 시간을 줄이기도 한다.
<위키 백과>
DB Connection 을 필요할 때 마다 만들고 삭제하는 비용이 크기 때문에 이를 줄이기 위해 DB Connection 정보를 캐시(메모리 영역)에 저장/관리하여 애플리케이션 단에서 DB Connection 정보가 필요할 때마다 Connection pool에서 연결 정보를 가지고 와 사용한다.
. Database 접속 설정 객체를 미리 만들어 연결을 하여 메모리 상에 등록해 놓아 클라이언 트가 빠르게 Database 접속을 할 수 있다.
. Database Connection 수를 제한할 수 있어 과다한 접속으로 인한 서버의 자원 고갈을 막 을 수 있다.
. Database 접속 모듈을 공통화해 Database 서버의 환경이 바뀔 경우 유지 보수를 쉽게 할 수 있다.
. 연결이 끝난 Connection 을 재사용함으로써 새로 객체를 만드는 비용을 줄일 수 있다.
maxActive : 서비스에서 동시에 사용될수 있는 최대 커넥션 개수. (기본값 : 8).
maxIdle : 커넥션 풀에서 유지될 수 있는 idle 상태 커넥션의 최대 개수. (기본값 : 8)
minIdle : 커넥션 풀에 유지될 수 있는 idle 상태 커넥션의 최소 개수. (기본값 : 0)
maxWait : 커넥션 풀이 비었을 때 사용할수 있는 커넥션을 반환받기까지 기다릴수 있는 최대시간 (ms) (기본값: -1, 무한대기)
validationQuery : 커넥션 풀에서 커넥션을 가져올때 해당 커넥션의 유효성 검증에 사용할 SQL Query. 반드시 하나 이상의 row 가 반환될 SELECT 구분이어야 함. 만약 설정되어 있지 않다면 isValid() 메서드를 호출해서 유효성 검증.
testOnBorrow : 커넥션 풀에서 커넥션을 가져올때 해당 커넥션의 유효성 검사를 할것인지 여부. (기본값 : true)
testOnReturn : testOnBorrow 와 비슷함. 다만 유효성 검사 시점이 커넥션을 풀에 반환할때 이다.
testWhileIde : 커넥션 유효성 검사를 풀에 idle 상태에 존재할때 실시할것인지 여부 (기본값 : false)
timeBetweenEvictionRunsMillis : 설정된 시간 간격마다 놀고 있는 커넥션을 풀에서 제거하는 evictor thread 가 실행된다. minIdle 로 커넥션을 유지한다.
numTestsPerEvictionRun : evictor thread 가 한번실행시 검사할 대상 커넥션 개수.
minEvictableIdleTimeMillis : evictor thread 작업시 설정된 시간만큼 사용되지 않은 커넥션을 제거한다. 그리고, thestWhileIdle 옵션이 true일 경우 설정된 시간을 초과하지 않은 커넥션에 대해서 validationQuery를 수행해서 유효하지 않은 커넥션을 제거한다.
BasicDataSource 의 createConnectionFactory() 메서드에 밑의 코드가 적혀있다. validationQuery 가 명시되지 않을 경우 false 로 변환하는 듯 하다.
if (this.validationQuery == null) {
this.setTestOnBorrow(false);
this.setTestOnReturn(false);
this.setTestWhileIdle(false);
}