본문으로 바로가기

9.(JSP)오라클 DBCP 설정

category SPRING/Servlet || JSP 2021. 3. 6. 10:45
728x90
반응형
SMALL

*DBCP 


DataBase Connection Pool의 약자로서  대부분의 사용자가 요구하는 웹서비스는 DB와 연동하는 것이 일반적이다. 사용자 요청이 있을때 마다 DB서버에 Connection을 맺어야 한다면, 만약! 한번에 다수의 사용자의 요청이 있다면 서버는 부담이 될 수 밖에 없다.

사용자의 입장에서는 대기시간이 길어 질 수 있다.

이 때문에 미리 일정한 양의 Connection을 미리 만들어 두면 훨씬 서버의 부담을 줄일 수 있고 사용자의 대기시간을 줄일 수 있다.

 

출처:https://devbox.tistory.com/entry/


*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 [장인개발자를 꿈꾸는 :: 기록하는 공간]

728x90
반응형
LIST