! 배워가고 있는 주인장이 쓴 글이니 정보의 정확성에 유의하시기 바랍니다 !
WebApp23
■■■ DBCP (DataBase Connection Pool) ■■■
○ 커넥션 풀(Connection Pool) 기법이란, 데이터베이스와 연결된 커넥션을
미리 만들어 풀(pool) 속에 저장해 두고 있다가 필요할 때 커넥션을
풀에서 꺼내어 가져다 쓰고 사용이 끝나면 다시 풀에 반납(반환)하는 기법을 말한다.
○ 데이터베이스를 연결하기 위한 커넥션(Connection)은 객체이다.
이 객체는 새롭게 만들어지는(생성하는) 과정에서 많은 시스템 자원을 요구하게 된다.
객체가 메모리에 할당되고, 객체에 사용할 여러 자원들에 대한 초기화 작업
그리고 객체가 더 이상 필요하지 않게 되었을 때 메모리를 회수하는 과정
등에서 많은 비용을 발생하고 요구되는 것이다.
○ JSP 페이지를 생성할 때 마다 커넥션을 생성해서 사용하게 되면
커넥션을 생성하고 닫는데 많은 시스템 자원을 요구하게 되기 때문에
동시 접속자 수가 많은 웹 어플리케이션의 경우 전체 성능을 떨어뜨리는 원인이 될 수 있다.
이러한 성능 저하 문제를 해결하기 위해 사용하는 일반적인 방식이
커넥션 풀(Connection Pool) 기법인 것이다.
○ DBCP 를 사용하기 위해서는 기본적으로 세 개의 패키지가 필요하다.
- Jakarta-Commons DBCP 1.2.1 (commons-dbcp-1.2.1.jar)
- Jakarta-Commons Collections 3.1 (commons-collections-3.1.jar)
- Jakarta-Commons Pool 1.2 (commons-pool-1.2.jar)
※ 하지만, 톰캣 6.x 부터 톰캣 서버 내부에 기본적으로 탑재되어 제공되기 때문에
(경로 : Tomcat Root\lib 또는 Tomcat Root\common\lib)
(파일 : tomcat-dbcp.jar)
다른 파일을 추가하거나 변경하지 않아도 무방하다.
○ 실습 환경 설정
1. Eclipse > Project Excplorer > Servers > Tomcat ... > context.xml
파일 접근 및 열기
2. 해당 파일의 맨 아래에 즉, 『</Context>』 닫히기 전에...
<Resource name="jdbc/myOracle" auth="Container"
type="javax.sql.DataSource"
driverClassName="Oracle.jdbc.driver.OracleDriver"
uri="jdbc:oracle:thin:@localhost:1521:xe"
username="사용자계정명" password="사용자패스워드"
maxActive="20" maxIdle="10" maxWait="-1">
</Resource>
maxActive : 화장실에 들어갈 수 있는 인원
maxIdle : 최대 쉬고 있는 인원
maxWait : 화장실이 다 차있을 때 기다리는 시간 (1000:1초 / -1:나올때까지 기다린다.)
MA = MI
8 = 8
0 8
1 7
2 6
1 7
:
내용을 추가한다.
- name
: 리소스 식별을 위한 이름
- auth
: 해당 리소스를 사용하게 되는 주체
- type
: 리소스의 타입(패키지 경로 포함)
- driverClassName
: 사용할 JDBC Driver 의 클래스 이름
- url
: JDBC Driver 에 의해 연결할 Connection 에 대한 URL
- username
: Connection 을 연결할 사용자 이름(오라클 사용자)
- password
: Connection 을 연결할 사용자 이름에 대한 비밀번호(오라클 암호)
- maxActive
: Connection Pool 에 제공할 최대 Connection 의 갯수
(어플리케이션 최대 커넥션 사용량을 기준으로 지정.
동시 접속자 수를 감안하여 지정.)
- maxIdle
: 사용되지 않고 풀(pool)에 저장될 수 있는 최대 Connection 의 갯수
- maxWait
: 대기 시간. 단위는 1/1000초.
0 보다 작게 설정할 경우 무한히(응답을 받을 때 까지) 대기.
Servers > Tomcat v8.5 Server at localhost-config > context.xml
:
web.xml
DBCPConn.java
/*====================
DBCPConn.java
=====================*/
package com.util;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DBCPConn
{
//싱글톤 형태로 구성을 위한 static 구성
private static Connection conn = null;
public static Connection getConnection()
{
if(conn == null)
{
try
{
//_Servers > context.xml에 구성한 resource 쓰기 위함
// ○ 컨텍스트 얻어내기
Context ctx = new InitialContext();
//-- 컨텍스트(Context)를 얻어내는 가장 쉬운 방법은 //texts < contents < context (더 큰 개념)
// 『javax.naming.InitialContext()』 클래스의
// 인스턴스를 생성하는 것이다.
// → 『new InitialContext();』
// 이렇게 얻어낸 컨텍스트(Context)를 활용하여
// 이름과 객체를 바인딩하게 된다.
// ※ javax.naming.InitialContext 의 메소드
// - bind(String str, Object obj)
// : 서비스할 객체를 특정 이름으로 등록한다.
// - rebind(String str, Object obj)
// : 서비스할 객체를 특정 이름으로 다시 등록한다.
// - list(String str)
// : 특정 이름으로 서비스하는 객체 정보를 반환한다.
// - unbinding(String str)
// : 등록된 객체를 메모리에서 해제한다.
// - Object lookup(String str)
// : 서비스중인 객체 정보를 얻어온다.
//『web.xml』로 부터 환경 설정을 얻어올 수 있도록 하겠다는 의미의 코딩
//Context evt = ctx.lookup("web.xml 로 부터 서비스중인 객체 정보를 얻어와"); //ctx > evt
Context evt = (Context)ctx.lookup("java:/comp/env"); //object → context 다운캐스팅
//-- 다른 형태로 변경 불가~!!!
// 『web.xml』 내에서 『"jdbc/myOracle"』으로 등록된 객체 정보를 얻어오겠다는 의미
DataSource ds = (DataSource)evt.lookup("jdbc/myOracle");
// DataSource 로 부터 Connection 을 얻어오겠다는 의미
conn = ds.getConnection();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
return conn;
}//close getConnection()
public static void close()
{
if(conn!=null)
{
try
{
if(!conn.isClosed())
{
conn.close();
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
conn = null;
}//close close()
}
DBCPActionTest.jsp
: DBCPConn.java의 연결 상태 확인 하는 jsp파일
<%@page import="java.sql.Connection"%>
<%@page import="com.util.DBCPConn"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
Connection conn = DBCPConn.getConnection();
String result = "";
if(conn!=null)
{
result = "데이터베이스 연결 성공~!!!";
}
else
{
result = "데이터베이스 연결 실패 ㅠㅠ";
}
DBCPConn.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>DBCPActionTest.jsp</title>
<link rel="stylesheet" type="text/CSS" href="css/main.css">
</head>
<body>
<div>
<h1>DBCP를 활용한 데이터베이스 접속 실습</h1>
<hr>
</div>
<div>
<!-- DB 연결 테스트 결과 확인 -->
<%=result %>
</div>
</body>
</html>
! 배워가고 있는 주인장이 쓴 글이니 정보의 정확성에 유의하시기 바랍니다 !
'JAVA개념&실습' 카테고리의 다른 글
WEB : [0608] MVC패턴 실습02 (0) | 2023.06.15 |
---|---|
WEB : [0607] DBCPConn & MVC 패턴 실습01 (0) | 2023.06.15 |
WEB : [0607] JSTL 코어 실습 (0) | 2023.06.14 |
WEB : [0602] EL / JSTL (0) | 2023.06.06 |
WEB : [0602] Servlet(서블릿) + JSP (0) | 2023.06.06 |