WAS(Web Application Server)와 데이터베이스 사이의 연결에는 많은 비용이 든다. MySQL 8.0을 기준으로 INSERT 문을 수행할 때 필요한 비용의 비율은 다음과 같다. 괄호 안의 숫자가 비율을 의미한다.
- Connecting (3)
- Sending query to server (2)
- Parsing query (2)
- Inserting row (1)
- Inserting index(1)
- Closing (1)
즉, 서버가 DB에 연결하기 위한 Connecting 비용이 가장 큰 비율을 차지한다. 이처럼 Connection을 생성하는 작업은 비용이 많이 드는 작업이다. 이를 보완할 수 있는 방법이 바로 Connection Pool이다.
자바에서 DB에 직접 연결해서 처리하는 경우(JDBC) 드라이버(Driver)를 로드하고 커넥션(connection) 객체를 받아와야 한다. 그러면 매번 사용자가 요청을 할 때마다 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 때문에 매우 비효율적이다. 이런 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.
lib에 DB에 맞는 Driver 라이브러리 의존성 추가 (mySQL 및 OracleDB Driver 추가!)
C:/apache-tomcatxxxxx/conf/context.xml 의 context.xml에 커넥션 풀 등록!
🎇 자세한 설정 방법은 공식문서를 통해서 확인 가능!
톰캣서버 커넥션풀 등록 공식문서
MYSQL
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/pool"
auth="Container"
type="javax.sql.DataSource"
maxWait="5000"
username="root"
password="비밀번호"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/데이터베이스명?useSSL=false"/>
</Context>
OracleDB
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/pool"
auth="Container"
type="javax.sql.DataSource"
maxWait="5000"
username="root"
password="비밀번호"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:XE"
/>
</Context>
속성 이름 | 설명 |
---|---|
initialSize | BasicDataSource 클래스 생성 후 최초로 getConnection() 메서드를 호출할 때 커넥션 풀에 채워 넣을 커넥션 개수 |
maxActive | 동시에 사용할 수 있는 최대 커넥션 개수(기본값: 8) |
maxIdle | 커넥션 풀에 반납할 때 최대로 유지될 수 있는 커넥션 개수(기본값: 8), 음수일 경우 제한이 없다. |
maxTotal | 커넥션 풀이 제공할 최대 커넥션 갯수 |
minIdle | 최소한으로 유지할 커넥션 개수(기본값: 0) |
maxWait | 커넥션 풀에서 가져올 수 있는 커넥션이 없을 때 대기 시간. 0보다 작을시 무한대기 |
maxTotal="20" maxIdle="10" maxWait="-1" 은
커넥션 풀이 제공할 최대 커넥션 갯수는 20개로써
사용되지 않고 커넥션 풀에 남아 있을 수 있는 커넥션 갯수는 0개~최대10개 까지이다.
다시말해서 최소한 10개는 커넥션 풀에 남아있으면 안되고 무조건 사용되어야 하고,
커넥션 풀에 남아 있을 수 있는 커넥션 갯수도 모두 사용되어 0개 이거나 최대 10개 까지는
사용되지 않고 사용하기 위해 대기상태로 두겠다는 뜻이다.
public static Connection getCon(){
Connection conn = null;
try{
//외부에서 서버 xml 데이터를 읽어들어야 하기에
Context initctx =new InitialContext();
//톰켓 서버에 정보를 담아놓은 곳으로 이동
Context envctx =(Context) initctx.lookup("java:comp/env");
//데이터 소스 객체를 선언, naming한 db이름
DataSource ds =(DataSource) envctx.lookup("jdbc/pool");
//데이터 소스를 기준으로 커넥션을 연결해주시오
conn = ds.getConnection();
//연결 커넥션 리턴
return conn;
}catch(Exception e){
e.printStackTrace();
}
return null;
}