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();
}
}