[JSP] 커넥션 풀(Connection Pool)
클라이언트가 DB를 사용하기위해 서버에 요청을 보낼때마다 connection객체를 만들고, 사용이 끝났을 떄 지우는 방법은 클라이언트가 많을 경우 DB 서버의 부담이 심하다.
웹 컨테이너(WAS)가 실행되면 미리 일정량의 커넥션 객체를 만들어 풀에 저장해두었다가 클라이언트에게서 요청이 오면 커넥션을 빌려주고, 다시 풀로 반납받음으로서 자원의 효율성을 확보한다.
개발환경
- JSP + Tomcat + MS SQL
기본적인 JDBC 커넥션 생성코드
public void openDB(){
String connectionURL="jdbc:sqlserver://[ip]:[port];databaseName=[dbName];user=[userName];password=[password]";
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn=DriverManager.getConnection(connectionURL);
stmt=conn.createStatement();
}catch(SQLException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}이렇게 DB에 직접 연결해서 데이터를 처리할 경우 사용자가 요청할 때마다 JDBC드라이버를 로드하고 커넥션 객체를 받아온 후 커넷견을 종료시키기 때문에 매우 비효율적이다.
커넥션풀이 가지는 특징
웹 컨테이너(WAS)가 실행되면서 커넥션 객체를 미리 풀에 생성해둔다.
HTTP요청에 따라 풀에서 커넥션 객체를 가져다 쓰고 반환한다.
이와 같은 방식으로 물리적인 데이터베이스 커넥션 부하를 줄이고 연결을 관리한다.
풀에 미리 커넥션이 생성되어있기 때문에 커넥션을 생성하는데 드는 시간이 매번 소비되지 않게할 수 있다.
커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수를 제한적으로 설정한다.
커넥션풀에 동시접속자가 많아질 경우
동시접속시 풀에서 미리 생성된 커넥션 객체를 제공하고 남은 객체가 없을 경우, 사용자는 커넥션 객체가 반환될 때까지 번호순대로 대기한다.
이때 WAS에서 커넥션 풀 크기를 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 접속할때 대기시간이 줄어들고, 반대로 컨넥션 풀을 적게 설정하면 그만큼 대기시간이 길어진다.
설정 방법
톰캣 설치폴더 lib폴더에 있는 tomcat-dbcp.jar 파일을 웹프로젝트\WebContent\WEB-INF\lib 폴더에 복사한다.
WebContents\META-INF 폴더에 context.xml 파일을 생성 후 아래 내용을 추가한다.
<Context>
<Resource
name="JOB"
auth="Container"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://10.240.33.50:1433"
username="[유저명]"
password="[비밀번호]"
type="javax.sql.DataSource"
maxActive="20"
maxIdle="10"
maxWait="-1"/>
</Context>3. WebContents\WEB-INF\lib 폴더에 web.xml파일 생성 후 아래 내용 추가
<resource-ref>
<res-ref-name>[위에서 지정한 name값]</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>4. DB 연결이 필요한 부분 소스코드 작성. 이때 context.lookup에는 java:comp/env/[resource 에서 지정한 name] 파라미터 주입
try{
Context init = new InitialContext();
DataSource ds = )DataSource) init.lookup("java:comp/env/JobTime");
conn=ds.getConenction();
connect=true;
}catch(Exception e){
connect=false;
e.printStackTrace();
}
참고
<Resource> 태그 각 속성의 의미
Name : JDNI로 호출될 이름. Context.xml과 web.xml파일의 name과 동일
Auth : DBCP를 관리할 관리자. Container혹은 Application.
driverClassName : JDBC를 이용하기 위한 드라이버클래스. 사용할 db종류에 따라 달라진다.
URL : DB접속 URL
username : DB계정명
password : DB로그인 패스워드
type : 해당 resource의 리턴타입(DataSource로 지정시 Connection객체 반환 가능)
maxActive : 최대 접속 허용 개수
maxIdle : 커넥션 풀의 최대 커넥션 개수
maxWait : 커넥션 할당을 기다리는 최대 시간(-1일 경우 무한 대기한다.)
출처: https://munjudiary.tistory.com/73 [Munju's Diary]
웹 컨테이너(WAS)가 실행되면 미리 일정량의 커넥션 객체를 만들어 풀에 저장해두었다가 클라이언트에게서 요청이 오면 커넥션을 빌려주고, 다시 풀로 반납받음으로서 자원의 효율성을 확보한다.
개발환경
- JSP + Tomcat + MS SQL
기본적인 JDBC 커넥션 생성코드
public void openDB(){
String connectionURL="jdbc:sqlserver://[ip]:[port];databaseName=[dbName];user=[userName];password=[password]";
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn=DriverManager.getConnection(connectionURL);
stmt=conn.createStatement();
}catch(SQLException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}이렇게 DB에 직접 연결해서 데이터를 처리할 경우 사용자가 요청할 때마다 JDBC드라이버를 로드하고 커넥션 객체를 받아온 후 커넷견을 종료시키기 때문에 매우 비효율적이다.
커넥션풀이 가지는 특징
웹 컨테이너(WAS)가 실행되면서 커넥션 객체를 미리 풀에 생성해둔다.
HTTP요청에 따라 풀에서 커넥션 객체를 가져다 쓰고 반환한다.
이와 같은 방식으로 물리적인 데이터베이스 커넥션 부하를 줄이고 연결을 관리한다.
풀에 미리 커넥션이 생성되어있기 때문에 커넥션을 생성하는데 드는 시간이 매번 소비되지 않게할 수 있다.
커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수를 제한적으로 설정한다.
커넥션풀에 동시접속자가 많아질 경우
동시접속시 풀에서 미리 생성된 커넥션 객체를 제공하고 남은 객체가 없을 경우, 사용자는 커넥션 객체가 반환될 때까지 번호순대로 대기한다.
이때 WAS에서 커넥션 풀 크기를 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 접속할때 대기시간이 줄어들고, 반대로 컨넥션 풀을 적게 설정하면 그만큼 대기시간이 길어진다.
설정 방법
톰캣 설치폴더 lib폴더에 있는 tomcat-dbcp.jar 파일을 웹프로젝트\WebContent\WEB-INF\lib 폴더에 복사한다.
WebContents\META-INF 폴더에 context.xml 파일을 생성 후 아래 내용을 추가한다.
<Context>
<Resource
name="JOB"
auth="Container"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://10.240.33.50:1433"
username="[유저명]"
password="[비밀번호]"
type="javax.sql.DataSource"
maxActive="20"
maxIdle="10"
maxWait="-1"/>
</Context>3. WebContents\WEB-INF\lib 폴더에 web.xml파일 생성 후 아래 내용 추가
<resource-ref>
<res-ref-name>[위에서 지정한 name값]</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>4. DB 연결이 필요한 부분 소스코드 작성. 이때 context.lookup에는 java:comp/env/[resource 에서 지정한 name] 파라미터 주입
try{
Context init = new InitialContext();
DataSource ds = )DataSource) init.lookup("java:comp/env/JobTime");
conn=ds.getConenction();
connect=true;
}catch(Exception e){
connect=false;
e.printStackTrace();
}
참고
<Resource> 태그 각 속성의 의미
Name : JDNI로 호출될 이름. Context.xml과 web.xml파일의 name과 동일
Auth : DBCP를 관리할 관리자. Container혹은 Application.
driverClassName : JDBC를 이용하기 위한 드라이버클래스. 사용할 db종류에 따라 달라진다.
URL : DB접속 URL
username : DB계정명
password : DB로그인 패스워드
type : 해당 resource의 리턴타입(DataSource로 지정시 Connection객체 반환 가능)
maxActive : 최대 접속 허용 개수
maxIdle : 커넥션 풀의 최대 커넥션 개수
maxWait : 커넥션 할당을 기다리는 최대 시간(-1일 경우 무한 대기한다.)
출처: https://munjudiary.tistory.com/73 [Munju's Diary]