본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

Servlet - ConnectionPool(톰캣 DataSource)

by 개발하는 경제학도 2022. 3. 13.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.

교재로는 자바 웹을 다루는 기술을 사용하고 있습니다.


Connection Pool(커넥션 풀)

회원 정보를 조회하는 등 DB와 연동이 필요할 때마다 DB에 연결을 시도하면 시간이 많이 소요된다는 단점이 있다.

특히, 많은 사용자가 있는 홈페이지에서는 매번 DB에 연결하는 방식이 더욱 비효율적이다.

이를 해결하기 위해서 DB와의 연결을 미리 설정해둬 빠른 DB 연동을 할 수 있다. 이렇게 웹 애플리케이션이 실행될 때 연동할 DB와 미리 연결해두는 기술을 ConnectionPool(커넥션 풀)이라 한다.

 

톰캣과 ConnectionPool

톰캣은 자체적으로 ConnectionPool 기능을 제공하고 있다.

톰캣 실행시 톰캣은 설정 파일에 설정된 DB정보를 이용해 DB와 미리 연결하여 ConnectionPool객체를 생성해둔다.

이후 애플리케이션이 DB와 연동할 일이 생기면 ConnectionPool객체의 메서드를 호출해 빠르게 연동시킨다.

ConnectionPool 방식은 javax.sql.DataSource api를 사용한다.

 

직접 연결하는 방식 vs ConnectionPool 방식 설정 방법

1. 직접 DB 연결 – DriverManager 이용

Class.forName("jdbc driver클래스명")
DriverManager.getConnection("db명 포트 ip", "계정", "암호");//필요시 con 생성

 

2. ConnectionPool - tomcat DataSource 이용

 

 

Servers폴더 내의 context.xml에서 <Resource> 태그를 이용해 톰캣 실행 시 연결할 DB를 미리 설정할 수 있다.

이 설정을 통해 1번의 코드는 작성할 필요가 없게 된다.

<Resource name="jdbc/mydb" 
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://127.0.0.1/접속할DB스키마"
username="DB접속 ID" password="DB접속 비밀번호"
maxActive="5" maxIdle="3"  />

 보통 name과 driverClassName, user, password, url만 수정해서 사용한다.

 


예시 코드

아래의 두 경우를 모두 실행해서 비교해볼 수 있다.

실행해보면 2번째 코드인 ConnectionPool을 사용한 코드가 훨씬 빠르게 수행되는 것을 알 수 있다. 그 이유는 ConnectionPool방식은 미리 DB 연결을 설정해두기 때문에 연결이 훨씬 빨라지기 때문이다.

 

[직접 DB 연결 – DriverManager 이용]

@WebServlet("/conpool")
public class ConnectionPoolServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	try {
	//test1	
	 Class.forName("com.mysql.cj.jdbc.Driver");
		for(int i = 1; i <=10000; i++) {
		Connection conn = DriverManager.getConnection
		("jdbc:mysql://127.0.0.1:3306/접속할스키마", "DB접속ID", "DB접속비밀번호");
		System.out.println(i + " 번째 " + conn  + " 연결성공");
	 
		//test2   주석 해제(주석시에는 db 다운, 서버 다운 확인)
		//주석 해제시 10000 번 모두 반복, 속도 느림.
		//conn.close(); 
			}
	}
	}
}

 

[ConnectionPool - tomcat DataSource 이용]

@WebServlet("/conpool")
public class ConnectionPoolServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 try {
	//1. context = dynamic web project
	 //servlettest 관련설정 가능 
	 Context initContext = new InitialContext();
	//2. JNDI에 접근하기 위해 기본 경로(java:/comp/env)를 지정
	 Context envContext = 
	(Context)initContext.lookup("java:/comp/env"); 
	//3. 톰캣의 context.xml에 설정한 name값인 jdbc/mydb을 이용해서 미리 연결한 DataSource를 받아옴.
	 DataSource ds = 
	(DataSource)envContext.lookup("jdbc/mydb"); 
	 
	for(int i = 1; i <= 10000; i++) {
	//4. connectionpool 객체 con 빌려오기
	 Connection con = ds.getConnection();	
    //sql 작업
	System.out.println(i + " 번째 연결 " +con+"완료");
	con.close();
    // 5.connectionpool 객체 반납 
	 
	}//for end
	  
	 
	}catch(Exception e) {
		e.printStackTrace();
	}
}
}

 

댓글