[JSP] 11.5 자카르타 DBCP API를 이용한 커넥션 풀 사용
2022. 4. 28. 17:10ㆍJAVA/Servlet&JSP
1. 커넥션 풀(Connection Pool)이란?
커넥션 풀 기법이란 데이터베이스와 연결된 커넥션을 미리 생성하여 풀(pool) 속에 저장해 두고 있다가 필요할 때에 커넥션을 풀에서 가져다 쓰고 다시 풀에 반환하는 기법을 의미합니다.
커넥션 풀 기법
- 풀(pool) 속에 데이터베이스와 연결된 커넥션을 미리 생성해 놓음
- 커넥션이 필요한 경우 커넥션을 새로 생성하지 않고 풀 속에 미리 대기하고 있는 커넥션을 가져다 사용함
- 다 사용된 커넥션은 다시 풀에 반환함
커넥션 풀 특징
- 풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는데 드는 연결 시간이 소비되지 않음
- 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 많지 않음
2. DBCP API의 사용 방법
- DBCP 관련 jar 파일 및 JDBC 드라이버 jar 파일 다운로드
- 커넥션 풀 관련 설정 파일 초기화
- 커넥션 풀 관련 드라이버 로딩
- 커넥션 풀로부터 커넥션 사용
3. 자카르타 DBCP API Jar 파일 다운로드
3.1 https://commons.apache.org/ 이동하여 Collection, DBCP, POOL 다운로드
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 프로그래밍 기초부터 중급까지
'JAVA > Servlet&JSP' 카테고리의 다른 글
[Tomcat] Tomcat, JSP, Servlet 개념 및 구조 (0) | 2022.05.23 |
---|---|
[JSP] 14. 표현 언어(Expression Language) (0) | 2022.04.28 |
[JSP] 11.4 JSP에서 JDBC 프로그래밍하기 (0) | 2022.04.28 |
[JSP] 11.3 SQL 쿼리 기초 (0) | 2022.04.19 |
[JSP] 11.2 오라클 PDB 서버에 접속하기 (0) | 2022.04.19 |