IT 관련,,/Java관련 언어들

[웹/JSP]jsp 커넥션풀(dbcp) DB 연결하기~!!

IT깡패's 2020. 9. 6. 11:21
728x90
반응형
SMALL

안녕하세요~ 요번엔 보통 DB연결보다 빠르게 연결하게 도와줄 커넥션풀에 대해서 알아보도록 하겠습니다~ㅎㅎㅎ

 

커넥션 풀(Connection Pool)

 

1. 커넥션 풀(DBCP)

데이터베이스와 연결된 커넥션을 미리 만들어서 풀(pool) 속에 저장해 두고 있다가 필요할 때 커넥션을 풀에서 쓰고

다시 풀에 반환하는 기법을 말한다.

웹 프로그램에서는 데이터베이스의 환경설정과 연결 관리 등을 따로 XML파일이나 속성 파일을 사용해서 관리하고,

이렇게 설정된 정보를 이름을 사용하여 획득하는 방법을 사용한다.

- 웹 컨테이너가 실행되면서 커넥션(connection) 객체를 미리 풀(pool)에 생성해 둡니다.

- DB와 연결된 커넥션(connection)을 미리 생성해서 풀(pool) 속에 저장해 두고 있다가 필요할 때에 가져다 쓰고

반환한다.

- 미리 생성해두기 때문에 데이터베이스에 부하를 줄이고 유동적으로 연결을 관리 할 수 있다.

이렇게 풀 속에 미리 생성되어 있는 커넥션을 가져다가 사용하고, 사용이 끝나면 커넥션을 풀에 반환한다.

 

2. 커넥션풀(DBCP) 사용 이유

 

만약 한명의 접속자가 웹 사이트에 접속했다고 가정한다. 해당 웹 사이트에서 접속자는 게시판을 확인하고 자신이 쓴

게시물을 수정하고 또 새로운 게시글을 등록한다고 가정해보자.

그럼 이 한명의 접속자로 인해 DB접속은 아래와 같이 발생한다.

1) 데이터 취득

2) 검색 후 데이터 취득

3) 데이터 갱신

4) 데이터 새등록

 

즉 한명의 접속자로 인해 단 시간에 4번의 DB 접속이 일어난다.

그럼 웹상에서 아주 짧은 시간에 몇번의 DB 접속이 일어날까? 만약 접속자가 1000명 이라면? 즉 커넥션 풀이란 미리

커넥션 객체를 생성하고 해당 커넥션 객체를 관리하는것을 의미한다.

즉 '커넥션 풀에 DB와 연결을 해 놓은 객체를 두고 필요할 때마다 커넥션 풀에서 빌려온다' 라고 이해하면 개념잡기에

쉬울듯 하다.

그리고 연결이 끝나면 다시 풀에 돌려준다.

커넥션 풀을 너무 크게 해놓으면 당연히 메모리 소모가 클것이고, 적게 해놓으면 커넥션이 많이 발생할 경우 대기시간이

발생할 것이다. 즉 웹 사이트 동시 접속자수 등 서버 부하에 따라 크기를 조정해야 할것이다.

 

cp.) 

서버는 동시에 사용할 수 있는 사람의 수라는 개념이 존재합니다.일반적인 커넥션을 이용하면 동시 접속자 수를 벗어나

게 될 경우 에러(예외)가 발생하게 됩니다.

예외가 발생하면 그 접속자는 더이상 처리를 하지 못하므로, 사이트 이용자는 다시 접속을 시도해야하는 불편함이 있습

니다. 이를 해결하기 위해 탄생한 것이 커넥션 풀 입니다.

 커넥션 풀이란 동시 접속자가 가질 수 있는 커넥션을 하나로 모아놓고 관리한다는 개념입니다. 누군가 접속하면 자신이

관리하는 풀에서 남아있는 커넥션을 제공합니다.

하지만 남아있는 커넥션이 없는 경우라면 해당 클라이언트는 대기 상태로 전환시킵니다. 그리고 커넥션이 다시 풀에

들어오면 대기 상태에 있는 클라이언트에게 순서대로 제공합니다.

- JDBC를 통하여 DB에 연결하기 위해서는 드라이버(Driver)를 로드하고 커넥션(connection) 객체를 받아와야 한다.

- JDBC를 사용하면 사용자가 요청을 할 때마다 매번 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기

때문에 매우 비효율적이다.

- 이런 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.

 

3. 커넥션풀(DBCP)의 특징

 - 풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는 데 드는 연결 시간이 소비되지 않는다.

 - 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 많지 않다.

--> 커넥션 풀을 사용하면 커넥션을 생성하고 닫는 시간이 소모되지 않기 때문에 그만큼 어플리케이션의 실행 속도가

빨라지며, 또한 한 번에 생성될 수 있는 커넥션 수를 제어하기 때문에 동시 접속자 수가 몰려도 웹 어플리케이션이 쉽게

다운되지 않는다.

 

4. 그렇다면 동시 접속자 처리는..?

커넥션 풀에서 생성되어 있는 커넥션의 갯수는 한정적이다. 그렇다면 동시 접속자가 많아지면 어떻게 될까?

커넥션 풀은 누군자 접속하면 커넥션 풀에 남아 있는 커넥션을 제공하는 식이다. 하지만 남아있는 커넥션이 없을 경우

해당 클라이언트는 대기 상태로 전환이 되고, 커넥션이 반환되면 대기하고 있는 순서대로 커넥션이 제공된다.

 

- 환경설정하기

commons-collections-3.2.2.jar
0.56MB
commons-dbcp-1.3.jar
0.14MB
commons-pool-1.6.jar
0.11MB

 

커넥션풀 작동하는 환경을 보면 commons로 시작하는 라이브러리를 넣어준 것을 확인할 수 있습니다.

이걸 꼭 넣어줘야 이걸들이 작동하게 됩니다.

그리그 저 META-INF 안에 있는 Context.xml이 있는데요~

이 설정을 한번 살펴보지요~

 

- Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/OracleDB"
       auth="Container"
       type="javax.sql.DataSource"
       username="db명"
       password="db패스"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       factory="org.apache.commons.dbcp.BasicDataSourceFactory"
       url="db호스트"
       maxActive="500"
       minIdle="100" />
  
</Context>  

 

이렇게 설정하면 db와 오라클이 연동되게 할 수 있습니다.

오라클 설정은 대략적으로 아실테니 txt파일에 작성된 코드만 올려보겠습니다~

이제 jsp안에 커넥션풀 연결할 코드를 살펴봅시다~

 

- txt파일

drop table tdbcp;

create table tdbcp(
	username varchar2(15) not null,
	email varchar2(20) not null
);

select * from tdbcp;

commit;

 

- dbcp.jsp

<%@page import="java.sql.ResultSet"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.PreparedStatement"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<style type="text/css">

body{
   text-align: center;
}
</style>

<%
	request.setCharacterEncoding("UTF-8");

	Connection conn = null;
	PreparedStatement ps = null;
	
	Context initContext = new InitialContext();
	Context envContext =
			(Context)initContext.lookup("java:/comp/env");
	DataSource ds = (DataSource)envContext.lookup("jdbc/OracleDB");
	
	conn = ds.getConnection();
	
	if(request.getParameter("username") != null){
		String sql = "insert into tdbcp values(?,?)";
		
		ps = conn.prepareStatement(sql);
		ps.setString(1, request.getParameter("username"));
		ps.setString(2, request.getParameter("email"));
		ps.executeUpdate();
		
	}
%>

dbcp.jsp<br><br>
<h1>DBCP.jsp</h1>
<body>
<form name="myform" method="post" action="dbcp.jsp">
   이름 : <input type="text" name="username"><br>
  이메일 : <input type="text" name="email"><br>
</form>
<br><hr><br>
목록보기<br>

<%
  	String sql = "select username, email from tdbcp";
    
	ps = conn.prepareStatement(sql);
	ResultSet rs = ps.executeQuery();
	
	int i=1;
	while(rs.next()){
		out.println(i + " : " + rs.getString("username") + " , " +
	    rs.getString("email") + "<br>");
	i++;
	}
	rs.close();
	ps.close();
	conn.close();
	
	
%>
</body>

 

자 이렇게 하면 일반적으로 웹으로 연결하게 되면 일반적인 것보다 일단 빠르게 작동될 것입니다!!

마지막으로 jsp로 연결한 db연동 테스트결과를 올려보도록 하겠습니다~!!

 

- 참고링크


jsp 커넥션풀 - https://devbox.tistory.com/entry/JSP-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80-1

728x90
반응형
LIST