[JSP] DBCP

Whatever·2022년 1월 21일
0

JSP

목록 보기
24/30

HTTPServlet - init()메소드가 꼭 필요함

DBCP란?

DataBase Connection Pool의 약자로 DB와 커넥션을 맺고있는 객체를 관리한다.


1. DBCP 다운로드

1. mvnrepository 접속

2. Commons DBCP 검색

3. jar 파일 다운

4. Commons-pool 검색, jar파일 다운

5. Commons-logging 검색, jar 파일 다운

2. 데이터 베이스 세팅

1. 계정 생성, 권한부여

2. 테이블 생성

CREATE TABLE MEMBER(
    MEMBERID VARCHAR2(20),
    PASSWORD VARCHAR2(100),
    NAME VARCHAR2(90),
    EMAIL VARCHAR2(60),
    CONSTRAINT PK_MEMBER PRIMARY KEY(MEMBERID)
)
INSERT INTO MEMBER(MEMBERID, PASSWORD,NAME,EMAIL)
SELECT MEM_ID, MEM_PASS, MEM_NAME, MEM_MAIL
FROM JYJ94.MEMBER;

COMMIT;


위와 같이 입력하면 JYJ94.MEMBER에 저장된 데이터들이 jspexam의 MEMBER 테이블에 저장된다.

DBCP를 설정하는 클래스

DBCPInit.java

package jdbc;

import java.sql.DriverManager;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.commons.dbcp2.ConnectionFactory;
import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
import org.apache.commons.dbcp2.PoolableConnection;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.dbcp2.PoolingDriver;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

//서블릿 클래스
public class DBCPInit extends HttpServlet {
	@Override
	public void init() throws ServletException{
		//JDBC Driver를 로딩
		loadJDBCDriver();
		//커넥션풀을 초기화
		initConnectionPool();
	}
	
	//JDBC Driver를 로딩
	private void loadJDBCDriver() {
		try {
			//커넥션풀이 내부에서 사용할 JDBC Driver를 로딩함
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}catch(ClassNotFoundException ex) {
			throw new RuntimeException("fail to load JDBC Driver", ex);
		}
	}
	
	//커넥션풀을 초기화
	private void initConnectionPool() {
		try {
			//의국     에서 새로운 외과 의사를 생성할 때 필요한 외과가             있어야 함
			//커넥션풀에서 새로운 커넥션   을 생성할 때 사용할 커넥션 펙토리를 생성
			ConnectionFactory connFactory = 
					new DriverManagerConnectionFactory(
							"jdbc:oracle:thin:@localhost:1521:xe"
							,"jspexam"
							,"java"
							);
			//DBCP는 커넥션풀에 커넥션을 보관할 때 PoolableConnection을 사용
			//이 Class는 내부적으로 실제 Connection을 담고 있음
			//커넥션 풀을 관리
			PoolableConnectionFactory poolableConnFactory =
					new PoolableConnectionFactory(connFactory, null);
			//커넥션이 유효한지 여부 검사 시 사용할 쿼리
			poolableConnFactory.setValidationQuery("select 1");
			//커넥션 풀의 설정 정보 생성
			GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
			//유휴 커넥션 검사 주기(1/1000초)
			//놀고 있는 커넥션을 풀에서 제거하는 시간 기준(5분)
			poolConfig.setTimeBetweenEvictionRunsMillis(1000L * 60L * 5L);
			//풀에 보관중인 커넥션이 유효한지 검사할지 여부
			poolConfig.setTestWhileIdle(true);
			//커넥션 최소 개수
			poolConfig.setMinIdle(4);
			//커넥션 최대 개수
			poolConfig.setMaxTotal(50);
			//커넥션풀의 설정 정보를 생성. 팩토리와 커넥션풀 설정을 파라미터로 받음
			GenericObjectPool<PoolableConnection> connectionPool = 
					new GenericObjectPool<>(poolableConnFactory, poolConfig);
			//풀러불커넥션팩토리에도 생성이된 커넥션 풀을 연결
			poolableConnFactory.setPool(connectionPool);;
			//커넥션 풀을 제공하는 JDBC 드라이버를 등록함
			//oracle.jdbc.driver.OracleDriver
			Class.forName("org.apache.commons.dbcp2.PoolingDriver");
			PoolingDriver driver = 
					(PoolingDriver)DriverManager.getDriver("jdbc:apache:commons:dbcp:");
			//커넥션 풀 드라이버에 생성된 커넥션 풀을 등록
			//jdbc:apache:commons:dbcp:ddit
			driver.registerPool("ddit", connectionPool);
		}catch(Exception e) {
			throw new RuntimeException(e);
		}//end try
	}//end initConnectionPool()
}

커넥션을 제공해주는 클래스

ConnectionProvider.java

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

//커넥션을 제공해주는 클래스
public class ConnectionProvider {
	public static Connection getConnection() throws SQLException {
		return DriverManager.getConnection(
				"jdbc:apache:commons:dbcp:ddit");
	}
}

JDBC

JDBCUtil.java

package jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//하나의 클래스에 같은 이름의 메소드를 여러번 사용 가능?
//오버로딩
public class JdbcUtil {
	public static void close(ResultSet rs) {
		if(rs!=null)try {rs.close();}catch(SQLException ex) {}
	}
	public static void close(Statement stmt) {
		if(stmt!=null)try {stmt.close();}catch(SQLException ex) {}
	}
	public static void close(Connection conn) {
		if(conn!=null)try {conn.close();}catch(SQLException ex) {}
	}
	public static void close(PreparedStatement pstmt) {
		if(pstmt!=null)try {pstmt.close();}catch(SQLException ex) {}
	}
	public static void rollback(Connection conn) {
		if(conn!=null)try {conn.rollback();}catch(SQLException ex) {}
	}
	
}

0개의 댓글