*DBCP
DataBase Connection Pool의 약자로서 대부분의 사용자가 요구하는 웹서비스는 DB와 연동하는 것이 일반적이다. 사용자 요청이 있을때 마다 DB서버에 Connection을 맺어야 한다면, 만약! 한번에 다수의 사용자의 요청이 있다면 서버는 부담이 될 수 밖에 없다.
사용자의 입장에서는 대기시간이 길어 질 수 있다.
이 때문에 미리 일정한 양의 Connection을 미리 만들어 두면 훨씬 서버의 부담을 줄일 수 있고 사용자의 대기시간을 줄일 수 있다.
*DBCP 설정 방법
필자는 현재 오라클db, 톰켓7.0 을 사용중이다.
1.server.xml 설정방법, 2.context.xml 설정방법
1번을 선택해서 적용했으며 2번 방식도 1번 방식과 동이하게 적용시키면된다.
1.톰켓의 server.xml 들어가자
2.Context docBase 를 그안에 검색하여 선언문을 작성한다.
처음에는 <Context docBase= ~~~~~~/></Host>
이런식으로 Context 끝에 / 로 닫혀있을것이다 . 해당 닫힘표시를 제거후 </Context>를 추가하여
그 안에 <Resource> 문을 추가하면 된다.
<Resource name="jdbc/myoracle" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="yjy" password="yjy" maxActive="20" maxIdle="10"
maxWait="-1"/>
<Resource name="jdbc/원하는이름" auto="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver(개인의db드 라이버 이름에 맞게)" url="jdbc:oracle:thin:@localhost:1521:xe"
username="아이디" password="비밀번호" maxActive="20" maxIdle="10" maxWait="-1"
커넥션 풀의 속성
속성 |
설명 |
maxActive |
커넥션 풀이 제공할 최대 커넥션 갯수 |
whenExhaustedAction |
커넥션 풀에서 가져올 수 있는 커넥션이 없을 때 어떻게 동작할지를 지정. 0일 경우 에러 발생 1일 경우 maxWait 속성에서 지정한 시간만큼 커넥션을 구할때까지 기다림. 2일 경우 일시적으로 커넥션을 생성해서 사용 |
maxWait |
whenExhaustedAction 속성의 값이 1일 때 사용되는 대기 시간. 단위는 1/1000초, 0보다 작을 경우 무한히 대기 |
maxIdle |
사용되지 않고 풀에 저장될 수 있는 최대 커넥션 갯수. 음수일 경우 제한이 없음 |
minIdle |
사용되지 않고 풀에 저장될 수 있는 최소 커넥션 갯수. |
testOnBorrow |
true일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사 |
testOnReturn |
true일 경우 커넥션 풀에 커넥션을 반환할 때 커넥션이 유효한지의 여부를 검사 |
timeBetweenEvctionRunsMillis |
사용되지 않는 커넥션을 추출하는 쓰레드의 실행 주기 지정. 양수가 아닐 경우 실행되지 않는다. 시간 단위는 1/1000초. |
numTestsPerEvictionRun |
사용되지 않는 커넥션을 몇 개 검사할 지 지정 |
minEvictableIdleTimeMillis |
사용되지 않는 커넥션을 추출할 때 이 속석에서 지정한 시간 이상 비활성화 상태인 커넥션만 추출. 양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거되지 않음. 시간 단위는 1/1000초 |
testWhileIdle |
true일 경우 비활성화 커넥션을 추출할 때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거. |
3.web.xml 설정
server.xml 에서 선언한 DataSource를 웹어플리케이션에서 사용하기 위해선 web.xml에 해당 resource를 참조한다는 선언을 해야한다.<web-app> 태크안에 다음의 항목을 추가한다.
<resource-ref>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
태그 | 설명 |
<res-ref-name> | JNDI 이름 context.xml에 선언한 resource의 이름을 지정한다. |
<res-type> | 톰캣 서버에서 리턴하는 resource의 클래스 이름(패키지명 포함) context.xml에 선언한 type과 같아야 한다. |
<res-auth> | 자원 관리 주체 Container : 서버에서 관리함을 의미 |
4.InitialContext 객체를 사용한 DBCP 예제
*DBManager.java(db연결 및 해제 클래스)
package util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
//DBCP: DataBase Connection Pool - connection을 일정 개수 미리 만들어 두고 웹 서버가 db에 접근이 필요할 때 마다 하나씩 빌리고 반납하는 방식으로 처리하여 위 문제를 해결한다.
public class DBManager {
//db연결
public static Connection getConnection() {
Connection conn=null;
try {
//1. InitialContext 객체 생성: 톰켓 서버에서 자원을 찾는 InitialContext
Context initContext=new InitialContext();
//2. 컨텍스트 객체의 lookup 메소드로 JNDI에 등록되있는 서버 자원을 찾음 DataSource ds = (DataSource) initialContext.lookup('java:/comp/env/jdbc/myoracle'); 과 동일
Context envContext=(Context)initContext.lookup("java:/comp/env");
DataSource ds=(DataSource)envContext.lookup("jdbc/myoracle");
//3. lookup 메소드로 얻어낸 DataSource 객체로 getConnection()메소드를 호출하여 커넥션 객체를 얻어냄
conn=ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//select 수행 후 리소스 해제를 위한 메소드
public static void close(Connection conn,Statement stmt, ResultSet rs) {
try {
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
// TODO: handle exception
}
}
//insert, update, delete 작업을 수행한 후 리소스 해제를 위한 메소드
public static void close(Connection conn, Statement stmt) {
try {
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
따로 클래스 형태로 빼둔뒤 DAO 에서 클래스를 불러서 사용하면된다.
*참고 출처
출처: https://devbox.tistory.com/entry/JSP-커넥션-풀-1 [장인개발자를 꿈꾸는 :: 기록하는 공간]
'SPRING > Servlet || JSP' 카테고리의 다른 글
10.(JSP) JDBC - PreparedStatement VS Statement 의 차이 (0) | 2021.03.09 |
---|---|
8.(JSP)한글.jpg 한글이름으로 된 이미지 출력하기 (0) | 2021.03.06 |
7.(JSP) *.do 서블릿과 FrontController 패턴 (0) | 2021.03.04 |
6.(JSP) Forwarding(포워딩) (0) | 2021.03.04 |
5.(JSP) MVC 패턴(model1,model2) (0) | 2021.03.04 |