0908 DBCP

yookyungmin·2022년 9월 8일
0

JDBC 프로그램의 사용자가 많아지면 하나의 작업이 만들어지고 close 되기 전에 동시접속자가 많아지면 Connection이 부족해져서 DB가 과부하가 걸려 서비스가 중단이 될수 있다.
이 문제점을 해결하기 위해 필요한것이 DBCP 라는 것이 있다.

DBCP : DATABASE Connection Pool, 데이터베이스에서 사용되는 커넥션 객체들의 울타리

  • 다수의 동시접속자가 발생시, DB 과부하에 의해 서비스가 막히는것을 방지하기 위해 Connection 객체를 일정 개수 생성 후, 대여&반환 해주는 시스템
    기존엔 접속하는 대로 Connection이 만들어지는데 이렇게 처리를 안하고
    Connection을 미리 만들어 놓고 사용자가 접속하면 생성해놓은 Connection 을 부여하고 초과가 되면 대기를 하게끔 하는 원리

Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.ObjectPool
의존성 라이브러리 에러
A라이브러리에서 또다른 B라이브러리를 필요로 할때

commons-dbcp2-2.9.0 // DBCP 외장 라이브러리
commons-pool2-2.11.1 // DBCP 외장 라이브러리에서 요구하는 추가 라이브러리
commons-logging-1.2 // 다시 추가로 요구하는 라이브러리

this.bds = new BasicDataSource();로 인해서 커넥션 에러가 나기 때문에

Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
커넥션 에러
private BasicDataSource bds = new BasicDataSource(); 이렇게 해야됨

Singleton Pattern

특정 클래스들은 new를 자유롭게 사용해선 안되고 단하나의 인스턴스로만 사용하게끔 제한해야 하는데, 이떄 사용 되는 디자인 패턴
들어오는 접속자마다 DAO를 생성하는게 아니라 하나를 만들어놓고 하나가지고 여러명이 쓰게끔 해줘야 함특정클래스를 한개이상 못만들게 하기 위해 싱글톤패턴

왜 Sington Pattern 을 사용하는가

기존처럼 Main(뷰)에서 CafeMenuDAO dao = new CafeMenuDAO(); 를 다수의 사용자가 발생하면 접속자 한명한명마다 DAO를 하나씩 만들어서 쓰는데( 따로따로 코드를 실행)
CafeMenuDAO dao = new CafeMenuDAO(); 하면 내부의 private BasicDataSource bds = new BasicDataSource(); 도 계속 생성이 되면
BasicDataSource의 커넥션도 this.bds.setInitialSize(30); 30개 60개 ~ 계속 생성되기 떄문에 생성자로 빼두고, 싱글톤 패턴 사용으로 한개의 DAO만을 가지고 여러명이 사용하게끔

왜 싱글톤패턴에 Static을 사용하는가?

static 은 new , 객체 생성없이 사용 가능. // 싱글톤패턴을 사용하려는데 어떻게 new 없이 접근을 할것인가 ? 그래서 public static CafeMenuDAO getInstance() static으로 만들어서
객체생성없이 CafeMenuDAO dao = CafeMenuDAO.getInstance(); 접근을 하고 if 과정을 통해 new CafeMenuDAO()를 사용하기 위함.
싱글톤패턴도 DAO의 종류가 많아지면 싱글톤패턴도 무효화 될수 있다< 코드 상에 DBCP 를 만들지 않고 플랫폼에 DBCP 요청
synchronized, 메서드 작업이 끝날때까지 기다려줘야 함 다음 쓰레드로부터 안전한 쓰레드 세이프, 동시에 여러명이 사용하면 안되는 메서드에 사용,

0개의 댓글