JDBC와 DBCP(DataBase Connection Pool)
1. JDBC (Java DataBase Connectivity)
: 데이터베이스와 연결하여 데이터를 송수신할 수 있도록 하는 인터페이스
다양한 종류의 관계형 데이터베이스에 접속하여 SQL문을 수행처리할 때 표준 SQL 인터페이스를 제공해 주는 API
- java.sql 패키지에 위치.
>> 단점이 있다.
- Database Pooling 방식을 사용하지 않고 DB에서 정보를 가져올 때마다 매번 Connection 객체를 생성하고 반납(close) 하는 형식임. > 이 방식은 비효율적이다.
>> 서버의 과부하 및 속도저하의 문제가 발생한다.
그러므로, 적당한 수의 커넥션 객체를 미리 만들어 놓고 요청에 따라 하나씩 꺼내쓰며 재사용하는 Pooling 기법을 사용한다면 문제를 해결할 수 있다.
2. DBCP (DataBase Connection Pool)
: 데이터베이스 커넥션을 미리 만들어서 풀(pool)에 저장해 두고 있다가, 요청이 들어올 때 가져다 쓰고 풀에 다시 반환하는 기능.
- 속도의 향상.
- 한정된 커넥션을 계속해서 재사용하기 때문에 동시 접속자수가 갑자기 늘어나도 웹어플리케이션이 쉽게 다운되지 않는 장점.
(커넥션 풀에 있는 커넥션 수만큼만 접속되고 나머지는 대기 상태가 된다.)
1) 어플리케이션이 DB 접속 요청 시 톰캣(WAS)은 Thread를 할당하여 커넥션 요청을 한다.
2) 해당 Thread는 사용가능한 커넥션을 획득하여 어플리케이션에 제공하고, 커넥션 사용 후에는 반납한다.
3) Thread 역시 사용 후 톰캣의 스레드풀에 반환됨.
** 코드 구현시 JDNI(Java Naming and Directory Interface)를 이용한다.
: 객체에 이름을 붙이고 명부에 등록한 뒤 검색하여 사용할 수 있도록 해주는 API
> DBCP 사용 설정 방식
1. 톰캣의 Server의 context.xml에 설정 >> 모든 프로젝트에 동일하게 적용됨.
2. 각 프로젝트의 META-INF 폴더에 context.xml을 작성하여 설정 >> 각각의 프로젝트에 맞게 적용 가능.
나는 2번 방식을 택했다.
이렇게 META-INF 폴더 안에 context.xml 파일을 넣어주었다.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
auth = "Container"
driverClassName = "oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@localhost:1521:xe"
username = "hr"
password = "hr"
name = "jdbc_oracle"
type = "javax.sql.DataSource"
maxTotal = "10"
maxWaitMillis = "3000"
/>
</Context>
<!--
maxTotal : 커넥션 풀이 제공할 수 있는 커넥션 갯수
maxWaitMillis : 최대 대기시간 설정. 0보다 작은값으로 설정하면 무한대기
-->
그리고 getConnection() 메소드를 이렇게 구현할 수 있다.
public Connection getConnection() {
Context ctx = null;
DataSource ds = null;
Connection conn = null;
try {
ctx = new InitialContext();
ds = (DataSource) ctx.lookup ("java:comp/env/jdbc_oracle");
conn = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
'Programming > Database' 카테고리의 다른 글
Transaction (0) | 2024.02.02 |
---|---|
JDBC (1) | 2023.12.20 |
정규화 Normalization와 조인 Join (1) | 2023.12.19 |
[연습문제 모음] (0) | 2023.12.18 |
Database 기초 (0) | 2023.12.18 |