[JSP] 11.5 자카르타 DBCP API를 이용한 커넥션 풀 사용

2022. 4. 28. 17:10JAVA/Servlet&JSP

 

1. 커넥션 풀(Connection Pool)이란?

커넥션 풀 기법이란 데이터베이스와 연결된 커넥션을 미리 생성하여 풀(pool) 속에 저장해 두고 있다가 필요할 때에 커넥션을 풀에서 가져다 쓰고 다시 풀에 반환하는 기법을 의미합니다.

 

커넥션 풀 기법

  • 풀(pool) 속에 데이터베이스와 연결된 커넥션을 미리 생성해 놓음
  • 커넥션이 필요한 경우 커넥션을 새로 생성하지 않고 풀 속에 미리 대기하고 있는 커넥션을 가져다 사용함
  • 다 사용된 커넥션은 다시 풀에 반환함

커넥션 풀 특징

  • 풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는데 드는 연결 시간이 소비되지 않음
  • 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 많지 않음

2. DBCP API의 사용 방법

  1. DBCP 관련 jar 파일 및 JDBC 드라이버 jar 파일 다운로드
  2. 커넥션 풀 관련 설정 파일 초기화
  3. 커넥션 풀 관련 드라이버 로딩
  4. 커넥션 풀로부터 커넥션 사용

 

3. 자카르타 DBCP API Jar 파일 다운로드

3.1 https://commons.apache.org/ 이동하여 Collection, DBCP, POOL 다운로드

 

Apache Commons – Apache Commons

Welcome to Apache Commons Apache Commons is an Apache project focused on all aspects of reusable Java components. The Apache Commons project is composed of three parts: The Commons Proper - A repository of reusable Java components. The Commons Sandbox - A

commons.apache.org

 

 

3.2 압축파일을 다운로드 받고 압축해제하면 다음 파일을 WEB-INF/lib 디렉터리에 복사 및 붙여넣기

  • commons-collections4-4.4.jar
  • commons-dbcp2-2.9.0.jar
  • commons-pool2-2.11.1.jar

4. DBCP에 관한 설정 파일 작성하기 

4.1 server.xml 파일에 DBCP에 관한 설정 파일 작성

  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
    
    <!-- name : Resource 이름 -->
    <!-- auth : 컨테이너를 자원 관리자로 기술 -->
    <!-- type : 웹에서 이 리소스를 사용했을 때 Datasource 타입으로 리턴 -->
    <!-- driverClassName : JDBC 드라이버 -->
    <!-- username : 아이디 -->
    <!-- password : 비밀번호 -->
    <!-- url : JDBC URL -->
    <!-- maxWait : 커넥션 풀에 사용 가능한 커넥션이 없을 때 커넥션의 회수를 기다리는 시간 -->
    <Resource auth="Container"
              driverClassName="oracle.jdbc.driver.OracleDriver"
              maxWait="5000"
              name="jdbc/jsptest"
              password="JSP2"
              type="javax.sql.DataSource"
              url="jdbc:oracle:thin:@localhost:1521/ORCLPDB" username="JSP2"/>
  </GlobalNamingResources>
      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
          ...
      
          <Context docBase="jdbc_test" path="/jdbc_test" reloadable="true" source="org.eclipse.jst.jee.server:jdbc_test">
              <Resource auth="Container" 
                        driverClassName="oracle.jdbc.driver.OracleDriver" 
                        maxWait="5000" 
                        name="jdbc/jsptest" 
                        password="JSP2" 
                        type="javax.sql.DataSource" 
                        url="jdbc:oracle:thin:@localhost:1521/ORCLPDB" username="JSP2"/>
          </Context>
      
      </Host>

 

4.2 JNDI 리소스 사용 설정 - web.xml

server.xml에 저장된 JNDI 리소스를 자바빈 또는 JSP 페이지에서 사용하려면 web.xml에 </web-app> 태그 바로 위에 <resource-ref> 엘리먼트를 기술해야합니다.

    <resource-ref>
	  	<description>jsptest db</description>       <!-- 리소스 설명-->
	  	<res-ref-name>jdbc/jsptest</res-ref-name>   <!-- server.xml의 <Resource>의 name 속성 -->
	  	<res-type>javax.sql.DataSource</res-type>   <!-- server.xml의 <Resource>의 type 속성 -->
	  	<res-auth>Container</res-auth>              <!-- server.xml의 <Resource>의 auth 속성 -->
  	</resource-ref>
        
</web-app>

 

4.3 JSP 페이지에서 커넥션 풀 사용

usepool.jsp

<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.naming.Context"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
	MEMBER 테이블의 내용
	<table width="100%" border="1">
		<tr>
			<td>이름</td>
			<td>아이디</td>
			<td>이메일</td>
		</tr>
<%
		Connection conn =null;
		PreparedStatement stmt = null;
		ResultSet rs = null;		
		try{

			Context initCtx = new InitialContext();
			Context envCtx = (Context) initCtx.lookup("java:comp/env");
			//initCtx의 lookup메서드를 이용해서 "java:comp/env" 에 해당하는 객체를 찾아서 evnCtx에 삽입
			DataSource ds = (DataSource)envCtx.lookup("jdbc/jsptest");
			//envCtx의 lookup메서드를 이용해서 "jdbc/jsptest"에 해당하는 객체를 찾아서 ds에 삽입
			conn = ds.getConnection();
			//getConnection메서드를 이용해서 커넥션 풀로 부터 커넥션 객체를 얻어내어 conn변수에 저장
			
			String query = "select * from MEMBER order by MEMBERID";
			
			stmt = conn.prepareStatement(query);
			rs = stmt.executeQuery();

			while(rs.next()){
%>
				<tr>
					<td><%= rs.getString("NAME") %></td>
					<td><%= rs.getString("MEMBERID") %></td>
					<td><%= rs.getString("EMAIL") %></td>
				</tr>
<%
			}
		}catch(SQLException e){
			System.out.println(e);
			e.printStackTrace();
		}finally{
			if(rs != null)
			{
				rs.close();
			}
			if(stmt != null)
			{
				stmt.close();
			}
			if(conn != null)
			{
				conn.close();
			}
		}
%>
	</table>
</body>
</html>

References

source code : https://github.com/yonghwankim-dev/JSP2.0
JSP 2.0 프로그래밍 기초부터 중급까지