DBCP

  • Database Connection Pool
  • 순간 접속자가 다량으로 발생했을 시, 미리 생성해 둔 Connection 객체를 대여하는 방식으로 접속자를 제한하는 기술
  • APACHE DBCP를 제일 많이 씀(Maven Repository에서 다운로드)
  • 동시 접속자가 한 번에 많이 들어오면 Connection을 close 하기 전에 서버가 다운됨
  • Server를 켜는 순간 Connection을 많이 만들어 놓고 Pool에 저장함
  • 접속한 사용자에게 저장한 Connection을 줌
  • 저장한 Connection을 다 썼으면 다음 사용자는 대기시킴
  • Connection이 반환되면 대기하는 사용자에게 순서대로 줌

 

▽ 예제 코드 1 ▽

import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp2.BasicDataSource;

public class TempMain {

	public static void main(String[] args) {
	
		BasicDataSource bds = new BasicDataSource();
        
		// DBMS 계정 및 초기 설정
		bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		bds.setUsername("kh");
		bds.setPassword("kh");
		bds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
        
		// 미리 만들어 놓을 Connection 객체 개수를 설정
		// 서버에 접속하자마자 Connection을 주지 않고 DB에 접속할 때 줌
		// DB 접속-처리 속도가 빠르기 때문에 순간 동시 접속하는 수임
		// XE는 100이 최대 가능 수
		bds.setInitialSize(30); 
		
		try (Connection con = bds.getConnection();){

		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
}

 

 

Singleton Pattern

  • 인스턴스 생성을 통제하는 디자인 패턴
  • 인스턴스를 1개 이상 생성하지 못하게 막는 기술

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbcp2.BasicDataSource;

public class CafeManager {
	
	// bds는 getConnection() 안으로 들어가면 지역 변수가 되기 때문에 멤버 필드로 빼야 함
	// but, CafeManager는 DB 접속 시도할 때마다 만들어지기 때문에
	// Connection 객체를 가지는 bds가 또 여러 개 만들어짐
	// -> 자원성 문제 생김
	// -> CafeManager를 한 번만 생성하도록 제한을 줘야 함
	// -> Design Pattern 중 Singleton Pattern 적용
	
	// 1. 생성자를 private으로 바꿔 줌
	// -> new 막기, private은 클래스 내부에서만 접근할 수 있음
	// 2. instance 생성
 	BasicDataSource bds = new BasicDataSource();
 	private static CafeManager instance = null;
 	
 	// 3. 메서드를 통해서 생성자를 쓸 수 있게 함
 	// 4. synchronized를 통해 한 번에 하나의 Thread만 접근할 수 있도록 함
 	public synchronized static CafeManager getInstance() { // DAO
 		
 		// 6. 1번만 만들 수 있게 함
 		if(instance == null)
 			instance = new CafeManager();
 		
 		return instance;
 	}
	
	// getConnection() 안으로 들어가면 설정해 주는 코드가 반복되기 때문에
	// 딱 한 번 실행하는 생성자로 넣어 줌
	private CafeManager() {
		bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		bds.setUsername("kh");
		bds.setPassword("kh");
		bds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		bds.setInitialSize(30); 
	}
	
	public Connection getConnection() throws Exception {
		return bds.getConnection();
	}
    
}

 

+ Recent posts