커넥션 풀
커넥션 풀 기법이란, 데이터베이스와 연결된 커넥션을 미리 만들어 풀(pool) 속에 저장해
두고 있다가 필요할 때에 커넥션을 풀에서 꺼내어 가져다 쓰고 다시 풀에 반환하는 기법을 말한다.
여러 개의 DB Connection을 하나의 Pool에 모아놓고 관리하고
그 객체를 여러 개 생성한 뒤 필요할 때 불러와 사용한다.
이를 통해 메모리 소모를 줄일 수 있고 성능 저하 문제를 해결할 수 있다!
톰캣 버전에 따라 관련 라이브러리가 필요한데,
톰캣 7버전이상이면 라이브러리를 추가하지 않아도 된다.
실습 환경을 설정하기 위해 Eclipst 에 접속하여 Servers > Tomcat > context.xml 파일 속
</Context> 태그 바로 위에 아래의 구문을 추가한다.
<Resource name="jdbc/myOracle" auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="사용자계정명" password="패스워드"
maxActive="20" maxIdle="10" maxWait="-1">
</Resource>
name - 리소스 식별을 위한 이름
auth - 해당 리소스를 사용하게 되는 주체
type - 리소스의 타입(경로 포함)
driverClassName - 사용할 JDBC Driver 의 클래스 이름maxActive - Connection Pool 이 제공할 최대 Connection 의 개수maxIdle - 사용되지 않고 풀에 저장할 수 있는 최대 커넥션의 개수maxWait - 대기 시간, 음수일 경우 무한히 대기
Container 가 위의 리소스 객체를 사용하기 위해서는 web.xml 에 설계도를 등록해야 한다.
<resource-ref>
<description>Oracle DataSource</description>
<res-ref-name>jdbc/myOracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
위의 코드를 web.xml 에 추가한다.
- <description> : 리소스에 대한 설명을 지정한다.
- <res-ref-name> : 사용하고자 하는 리소스의 이름을 지정한다.
- <res-type> : 사용하고자 하는 리소스의 타입을 지정한다. (위에 추가해준 코드와 같다.)
- <res-auth> : 리소스에 대한 권한이 누구인지 지정합니다.
이제 준비 됐다!!
DBCPConn 을 구성해보자.
package com.util;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DBCPConn
{
private static Connection conn = null;
public static Connection getConnection()
{
if (conn == null)
{
try
{
// ○ 이름과 객체를 바인딩
//-- 컨텍스트(Context)를 얻어내는 가장 쉬운 방법은
// 『javax.naming.InitialContext』 클래스의
// 인스턴스를 생성하는 것이다.
// → 『new initialContext();』
Context ctx = new InitialContext();
// 『web.xml』로 부터 환경 설정을 얻어오겠다는 코딩
//-- 다른 형태로 변경 불가
Context evt = (Context)ctx.lookup("java:/comp/env");
DataSource ds = (DataSource)evt.lookup("jdbc/myOracle");
conn = ds.getConnection();
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
return conn;
}
public static void close()
{
if (conn != null)
{
try
{
if (!conn.isClosed())
conn.close();
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
conn = null;
}
}
코드를 한 줄씩 살펴보자면..
Context ctx = new InitialContext();
JNDI 서버 객체 생성 구문이다.
JNDI 는 서버에서 관리하고 있는 리소스에 대한 정보를 알고 있고
특정 리소스를 찾아서 사용할 수 있도록 객체를 반환해주는 역할을 한다.
리소스가 로컬에 있을 때는 단순히 InitialContext 객체만 생성하면 된다.
Context evt = (Context)ctx.lookup("java:/comp/env");
이 구문은 딱 고정된 상태로 써야 하는 구문으로 다른 형태로 변경이 불가하다.
lookup() 메소드는 리소스를 찾은 후 리소스를 사용할 수 있도록 객체를 반환한다.
lookup 을 통해 어떤 Context를 반환 받고 있다.
DataSource ds = (DataSource)evt.lookup("jdbc/myOracle");
위와 같이 리소스를 찾은 후 리소스를 사용할 수 있도록 객체를 반환하는 구문이다.
우리가 server.xml 파일에 커넥션 풀을 설정할 때 리소스 타입을 DataSource로 등록했으므로
DataSource 타입으로 변환하는 것 !!
conn = ds.getConnection();
DataSource 객체의 getConnection( ) 메소드를 통해서 커넥션 풀에서
Free 상태의 Connection 객체를 획득한다.
그리고 이 커넥션 객체를 반환하면 끝 !!!!
그 외의 사용법은 DBConn 과 같다. !!!!!!!!!!!!!!!! 끗
수업만 들었을 땐 이해가 잘 안 갔는데..
구글링이 최고다!!!!!!!!!!!! 복습하자!!!!
'공부 > Web' 카테고리의 다른 글
Spring Security JWT 로그인 흐름 이해하기 (0) | 2024.06.11 |
---|---|
JAVA :: MVC 패턴 정리 (0) | 2022.05.05 |
JSP :: 자기 자신 페이지로부터 데이터 송수신 (0) | 2022.04.17 |
JAVASCRIPT :: onchange (0) | 2022.04.17 |
JAVASCRIPT :: onsubmit (0) | 2022.04.17 |