[ITWILL : JSP]커넥션풀(Connection Pool)

ITWILL학원 : 25강 JSP기초 BY 정규태강사

1. JNDI(Java Naming and Directory Interface)(p444~)

  • 필요한 데이터를 키-값 쌍으로 저장해서 필요시마다 키를 사용하여 값을 가져오는 방법

  • 예시 :

    • 내장객체.setAttribute(“키”, 값);
    • 내장객체.getAttribute(“키”);
    • 컬렉션의 해시맵/해시테이블 (“키”, 값);
    • DNS서버(도메인서버) : 도메인네임에 해당하는 ID정보를 저장해서 사용
  • 사용법

    • 컨테이너(예:톰캣)를 사용하여 Connection Pool생성하여 그 안에 이름에 해당하는 정보를 저장(=키), 해당하는 DB정보를 저장(=값)해서 사용.
  • 그렇다면 커넥션풀이 뭘까?

2. 커넥션풀(Connection Pool)

  • DB연결을 하기위한 객체

  • 효율적인 데이터 처리 가능

  • 도입된 배경 : 빈번한 디비연결/호출로 인해서 메모리낭비(누수)발생을 줄이고자 도입되었다.

  • 사용법 :

    • 미리 연결정보(Connection)를 생성
    • 필요할때마다 빌려주고
    • 다 쓰면 반납하는 방식
  • 작동방식 :

    1. 사용자 요청(Service)에 따른 Connection Pool에 쓸 쑤 있는 connection체크 후 connection 1개씩 할당 -> 있으면 바로 사용, 없으면 대기(반납되기를 기다리기)거나 임시객체를 생성
    2. 커넥션(연결정보)개수를 제한(커넥션풀이 알아서 효율적으로 관리함)
    3. 커넥션 객체를 다 쓰게되면 자원회수

https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/

2-1. 라이브러리 다운로드

커넥션풀을 사용하기 위해선 라이브러리를 다운받아야 한다.

  1. 라이브러리 다운로드 주소 : Apache Commons

  2. zip파일 다운로드 3가지

    • collections
    • dbcp
    • pool

위의 세가지를 차례대로 다운받으면 된다.
먼저 collections zip파일다운로드

그다음 dbcp zip파일다운로드

마지막 pool zip파일다운로드


  1. 압축 푼 뒤 D:\workspace_jsp7\JSP7\WebContent\WEB-INF\lib경로에 아래 세가지 파일을 복붙
    • commons-collections4-4.4.jar
    • commons-dbcp2-2.7.0.jar
    • commons-pool2-2.8.0.jar

2-2. 라이브러리를 서버에 연결

  1. META-INF폴더에 Context.xml 생성
  • DB연결에 필요한 정보를 저장할 수 있다.
  1. 속성작성
  • name : 외부에서 해당정보에 접근할 수 있도록하는 이름값(필요에 따라 변경가능)
  • auth : 자원관리자를 지정(Container/Application 고정)
  • type : 웹에서 사용될때(name속성으로 호출할때) 표시되는 객체 타입(고정)
  • driverClassName : JDBC드라이버주소(필요에 따라 변경가능)
    • mysql쓴다면 : com.mysql.jdbc.Driver
    • 오라클쓴다면 : oracle.jdbc.driver.OracleDriver
  • url : DB가 존재하는 위치 = 디비서버의 주소(필요에 따라 변경가능)
    • mysql쓴다면 : jdbc:mysql://localhost:3306/jspdb
    • 오라클쓴다면 : jdbc:oracle:thin:@localhost:1521:orcl
  • username/password : DB접속 계정 정보
  • maxWait : 커넥션풀에 사용가능한 커넥션이 없을 경우 커넥션의 회수를 기다리는 시간 지정(단위: 밀리초)
1
2
3
4
5
6
7
8
9
10
11
<Context>
<Resource
name="jdbc/mysqlDB"
auth="Container"
type="javax.sql.DataSource" //DataSource라는 객체가 DB정보를 저장
driverClassName="com.mysql.jdbc.Driver" //DataSource객체에 들어있는 정보
url="jdbc:mysql://localhost:3306/jspdb" //DataSource객체에 들어있는 정보
username="root" //DataSource객체에 들어있는 정보
password="1234" //DataSource객체에 들어있는 정보
/>
</Context>

2-3. JNDI 리소스 설정

  • web.xml파일에서 아래 코드 작성
    • description : 설명작성(의미없음, 원하는대로 작성하면됨)
    • 나머지정보들은 Context.xml파일에서 해당 설정값을 그대로 복붙할 것!
1
2
3
4
5
6
<resource-ref>
<description>ConnectDB</description>
<res-ref-name>jdbc/mysqlDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
  • 작동방식 : 서버를 실행하면 web.xml 먼저 접속 후 resource-ref코드를 보고 Context.xml을 읽어서 DB를 연결한다.

2-4. getCon()메서드 작성 : 커넥션풀 사용

memberDAO.java파일로 이동해서 getCon()메서드를 커넥션풀을 사용한 아래 코드로 변경해준다.

  • InitialContext클래스는 Context클래스를 재구현한 클래스이고 Object를 상속받았다

    1
    2
    3
    public class InitialContext
    extends Object
    implements Context
  • DataSource ds = (DataSource) init.lookup(“java:comp/env/jdbc/context파일의 name값그대로 입력”);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//드라이버로드 디비연결 : 커넥션 풀 사용
private Connection getCon(){

//Context 객체 생성
try {
Context init = new InitialContext(); //업캐스팅

//디비연결정보를 불러오기 ->DataSource 타입으로 저장
// 고정문구"java:comp/env/jdbc/다른문구context파일의 name값입력"
DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/mysqlDB");

//ds 사용해서 연결
con = ds.getConnection();
System.out.println("연결성공" + con);
} catch (SQLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
return con;
}