JDBC에서 기본적으로 지원하는 DriverManager는 각 연결마다 새로운 커넥션을 만든다. 그런데, 매 사용자의 요청마다 새로운 커넥션을 만들어서 데이터를 가공한다면 매우 불편할 것이다. 게다가 이 커넥션의 비용은 요청의 크기에 비례하지 않고 고정적으로 발생하며, 요청이 작으면 작을 수록 비용이 부담스러워 진다. 심지어 어떤 DB는 한번 생성하는데 수십 밀리초가 걸리기도 한다. 또한, 만약 관리를 잘못해서 커넥션이 해제되지 않는다면 쓸모없는 커넥션이 쌓여 큰 장애가 발생할 가능성도 있다.
이 때문에 고민하던 어느 개발자는 어느날 정말 획기적인 아이디어를 하나 제공한다. 그것은 바로 커넥션을 미리 만들어두고 그것만 쓰자는 것이었다. 이는 앞서 이야기 했던 두 가지 모두 해결이 된다.
위에 기술된 장점때문에 현재는 기본적으로 모두 커넥션 풀을 사용하며, 이를 구현한 오픈소스 또한 굉장히 많다. 그 중에서도 HikariCP를 가장 많이 사용하며, Spring에서도 기본적으로 사용되는 커넥션 풀이 HikariCP이다.
package jakarta.activation;
public interface DataSource {
public InputStream getInputStream() throws IOException;
public OutputStream getOutputStream() throws IOException;
public String getContentType();
public String getName();
}
DataSource란, 커넥션 풀의 커넥션들을 관리하기 위한 인터페이스이다. DriverManager와 마찬가지로 커넥션을 획득하고 반납하는 역할을 하지만, 가장 큰 차이점은 새로운 커넥션을 생성하는가 안하는가이다. 데이터 소스는 커넥션 풀에서 남아있는 커넥션을 가져오는 것이다. 모든 커넥션이 사용중이면 일정 시간동안 대기하게 되는데(기본값 30초) 이는 적절하게 조절해서 사용해야한다. 사용자의 요청을 0.5~2초안에 응답하지 않으면 뭔가 오류가 났다고 판단해버리기 때문이다.
기본적으로 DriverManager는 데이터 소스를 사용하지 않는데, 스프링에서는 DriverManager도 데이터 소스를 사용할 수 있도록 DriverManagerDataSource 클래스를 제공한다.