JDBC Connection pooling
1. pooling 기법
데이터베이스 커넥션을 여러 개 만들어서 특정 공간에 저장해 놓고, 여러 사용자가 필요할 때 마다 하나씩 꺼내서 사용하고 다시 집어넣는(Pooling) 방식을 말합니다.
데이터베이스 작업을 수행할 Client클래스들은 Connection Pool로부터 데이터베이스 커넥션을 하나 할당 받아서, 다 사용하고 난 후에는 다시 Connection Pool에게 넘겨 줍니다. Connection Pool에게 넘겨진 데이터베이스 커넥션은 다른 Client클래스가 사용을 요청했을 때 재사용이 됩니다.
2. Connection Pooling을 사용하는 이유
‘속도 향상’과 ‘자원 공유’
데이터베이스 연결을 의미하는 Connection클래스는 객체화 될 때, 다른 일반적인 클래스들과는 달리 수초의 시간이 걸립니다. 이 시간은 만약 데이터베이스가 원격지에 존재한다면, 네트웍의 상태에 따라 더 지연이 될 수도 있습니다. 만약 우리가 만들 애플리케이션이 빈번하게 데이터베이스 커넥션을 생성한다면,
이러한 시간적인 오버헤드는 전체 애플리케이션을 느리게 만들 것입니다.
이 경우, 애플리케이션이 시작될 때 일정수의 커넥션을 미리 만들어 놓고, Connection Pool을 통해 재사용 한다면 상당한 속도 향상을 기대할 수 있을 것입니다.
3. 구현 방법
3-1. DBCP Api 사용- 전체 프로젝트에 적용
web server의 context.xml 파일 내에 아래 내용 추가
<Resource name="jdbc_mysql" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
loginTimeout="10" maxWait="5000" username="root" password="123" testOnBorrow="true"
url="jdbc:mysql://localhost:3306/test" />
- Dao 클래스 에서
DataSource ds;
Connection conn;
public BoardDAO(){
//생성자에서 DataSource 얻기 : InitialContext 와 JNDI 명
try{
Context ctx = new InitialContext();
ds= (DataSource)ctx.lookup("java:comp/env/jdbc_oracle");
conn = ds.getConnection();
//** Mysql의 경우 ds= (DataSource)ctx.lookup("java:comp/env/jdbc_mysql");
}catch(Exception e){ e.printStackTrace();}
}
하면 된다.
이 때 oracle 드라이버 파일은 jdk의 jre\lib\ext 폴더 내에 존재해야 한다.
경우에 따라 apache-tomcat-5.5.27\common\lib 폴더에도 드라이버 파일이 있어야 한다.
Mysql 도 위와 같다.
3-2. DBCP 사용 - 각 프로젝트에 적용
각각의 프로젝트에 WebContent\META-INF 폴더에 context.xml 파일을 작성한다.
<Context>
<Resource name="jdbc_maria" auth="Container" type="javax.sql.DataSource"
driverClassName="org.mariadb.jdbc.Driver" loginTimeout="10" maxWait="5000"
username="root" password="123" testOnBorrow="true"
maxActive="500" maxIdle="100"
url="jdbc:mysql://localhost:3306/test" />
</Context>
3-3. pooling을 지원하는 파일을 이용할 수도 있다.
참고