본문 바로가기
DB/Oracle

커넥션풀(DBCP)

by avvin 2019. 5. 7.

커넥션풀(DBCP) 


DB커넥션풀 사용이유


jdbc 를 통해 db에 연결하기 위해서는 


드라이버를 로드하고 //Class.forName( 드라이버명 );

커넥션 객체를 받아와야한다 // Connection con = DriverManager.getConnection(url, id, password);


사용자가 요청할 때마다 매번 위 과정을 반복하는 것은 비효율적이므로 커넥션풀을 사용한다.



커넥션풀

(웹 서버 내의)웹컨테이너가 실행되면서 커넥션을 pool에 미리 만들어두고 필요할 때 가져다 쓰고 반환

미리 생성해두기 때문에 데이터베이스에 부하를 줄이고 유동적으로 연결을 관리



커넥션 풀 사용하기

웹컨테이너(웹서버)에서 pool을 생성


사용중인 Servers 폴더의 server.xml 소스코드 아래쪽에


1
2
                <Context docBase="JspStudy" path="/JspStudy"
                    reloadable="true" source="org.eclipse.jst.jee.server:JspStudy" />
cs


끝에 닫는 '/'를 지워주고 </Context>닫아준 뒤 


1
2
3
4
5
6
                <Context docBase="JspStudy" path="/JspStudy"
                    reloadable="true" source="org.eclipse.jst.jee.server:JspStudy" >
                    <Resource name="jdbc/pool" auth="Container" type="javax.sql.DataSource"
                      driverClassName="oracle.jdbc.driver.OracleDriver" loginTimeout="10" maxWait="5000"
                      username="system" password="123456" url="jdbc:oracle:thin:@localhost:1521:xe"/>
                </Context>
cs


이름(기억해둘 것), "Container"가 관리,  "javax.sql.DataSource" 객체를 이용해서 커넥션풀을 사용하겠다는 의미


Tip

e.printStackTrace();로 예외 처리를 해주었는데도 어디서 오류가 났는지 정확히 알 수 없다면 

매 코드마다 System.out.println("오류확인 n"); 을 달아서 실행해본다




커넥션풀 사용하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public void getCon() {
        try{
            //외부에서 데이터를 읽어들여야한다 
            Context initctx = new InitialContext();
//InitialContext() 클래스는 Context 인터페이스 구현클래스
            //톰캣 서버의 정보를 담아놓은 곳으로 이동
            Context envctx = (Context) initctx.lookup("java:comp/env");
            //데이터소스 객체(javax.sql.DataSource)를 선언
            //server.xml Context Resource에서 설정한 name을 매개값으로 준다.
            DataSource ds = (DataSource) envctx.lookup("jdbc/pool");
            //Resource이름을 매개값으로 주어 DataResource객체를 리턴
 
            //외부에서 데이터를 읽어들이는 Context 객체를 생성
            //그 객체의 lookup메서드로 톰캣서버정보를 읽어들이고
            //톰캣서버정보를 읽어들인 객체의 lookup메서드에 리소스이름을 매개값으로 주어
            //데이터소스객체(커넥션풀 사용할때 쓰기로한 객체)를 얻는다 
            //(커넥션풀)데이터소스를 이용하여 접속
            con = ds.getConnection();
            
        } catch(Exception e) {
            
            e.printStackTrace();
        }
        
    }

cs