Loading...

Web / / 2022. 2. 24. 12:39

Web 17강. DBCP

반응형

DB 연결할 때 Connection conn 객체를 파일마다 만들어줬었다.

커넥션 객체는 사용자마다 필요하다.

 

Connection Pooling기법을 사용하여

재사용 해줄 것이다.

 

DBCP(DataBase Connection Pooling) : 풀링 기법은 DB 커넥션 객체를 여러개 만들어서

커넥션 풀에 넣어놓고 클라이언트 객체가 필요할 때 마다 커넥션 객체를 가져다 쓰고

다 쓴 후에는 다시 풀에 돌려주는 기법

 

커넥션 풀에돌아간 커넥션 객체는 다른 클라이언트가 요청하면 재사용된다.

 

https://kyun2.tistory.com/48

 

[DBCP] 데이터베이스 커넥션 풀 기법 활용하기

DBCP(Database Connection Pooling) 풀링(pooling) 기법은 데이터베이스 커넥션 객체를 여러개 만들어서 커넥션 풀에 넣어놓고 클라이언트 객체가 필요할 때 마다 커넥션(Connection) 객체를 가져다 쓰고 다 쓴

kyun2.tistory.com

 

커넥션 객체를 100개까지 만들면 부하가 너무 심해진다.

내 하드웨어와 데이터베이스의 테스트를 통해 한계를 확인해야한다.

 

예를들어 50개까지 느려지지 않고

51개를 만들었을 때 웨이트 걸려서 느려진다고 해보자.

 

커넥션하고나서 DB에서 필요한 데이터를 응답받는순간

close해버린다.

서버가 응답 후 Stream을 끊어버리는 것과 같다.

부하가 심해지니까!

 

50개였던 커넥션 객체가 49개가 되고

그 다음 클라이언트가 들어오면 새로 커넥션 객체를 만들어야하는데

50개를 만들어두고

재사용하는 기술을 풀링기술이라고 한다.

 

이 풀링기술은 톰캣이 DBCP라는 라이브러리에 가지고있다.

톰캣이 DBCP로 돌고있을 때

커넥션 객체를 50개를 만들어둔다.

 

DBCP도 계속 돌고있으니 프로그램인데

자바 입장에서 DBCP에 접근할 때 포트나 이런걸 알고있어야하는데

이런게 많기 때문에 자바가 기억하기가 힘들다.

JNDI라는 걸 만들어두는데

이름 인터페이스와 같은것이다.

dbcp라는 이름과 DBCP 라이브러리를 맵핑해두는 것이다.

 

자바입장에서는 JNDI라이브러리에 붙어서

dbcp를 찾아, DBCP 라이브러리로 가서

커넥션을 가져오고 이런 과정이 필요함

 

Datasource 라이브러리를 사용하면 DBCP가 자동으로 일어나서

커넥션 관리를 알아서 해준다.

 

이제 DBCP를 사용할 때 방법을 정의해놓은 문서를 읽어보자.

https://tomcat.apache.org/tomcat-9.0-doc/index.html

 

Apache Tomcat 9 (9.0.58) - Documentation Index

This is the top-level entry point of the documentation bundle for the Apache Tomcat Servlet/JSP container. Apache Tomcat version 9.0 implements the Servlet 4.0 and JavaServer Pages 2.3 specifications from the Java Community Process, and includes many addit

tomcat.apache.org

 

 

 

 

javax.sql.DataSource가 import되어

DataSource jdbc/myoracle = new DataSource( ) 되는 코드이다.

이 클래스에는 상태값들을 설정해주는것이다.

 

아래 코드와 같은것이다.

import javax.sql.DataSource;

DataSoruce jdbc/myoracle = new DataSource();

jdbc/myoracle.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:mysid");
jdbc/myoracle.setUsername("scott");
jdbc/myoracle.setPassword("tiger");
jdbc/myoracle.setMaxTotal("20");
jdbc/myoracle.setMaxIdle("10");
jdbc/myoracle.setMaxWaitMilis("-1");

 

 

context.xml 파일은 초기 세팅을 위해

한번만 연결하면 되는 애들을 말한다.

 

복사해오자.

 

코드를 보니 딱봐도 데이터베이스와 연결하는 코드이다.

 

처음에 연결했을 때 기본으로 만들어놓는 커넥션 객체가 10개이고

20개까지 생성된 후 이후에는 재사용하겠다는 말이다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>

	<Resource name="jdbc/myoracle" auth="Container"
		type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
		url="jdbc:oracle:thin:@127.0.0.1:1521:xe" username="SCOTT"
		password="TIGER" maxTotal="20" maxIdle="10" maxWaitMillis="-1" />

	<WatchedResource>WEB-INF/web.xml</WatchedResource>
	<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
	<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>


</Context>

 

 

DataSource가 new 되었으니 jdbc/myoracle을 통해 접근할 수 있는것이다.

 

<resource-ref>
	<description>Oracle Datasource example</description>
	<res-ref-name>jdbc/myoracle</res-ref-name>
	<res-type>javax.sql.DataSource</res-type>
	<res-auth>Container</res-auth>
</resource-ref>

 

context.xml은 서버가 시작할 때 한번 동작하는 것이고,

web.xml도 서버가 시작할 때 동작하는데

클라이언트가 request 할 때마다 사용된다.

 

클라이언트는 이를 통해 DB를 접근하는데

request할 때마다 web.xml의 변수이름을 참조하여

DB에 커넥션하게 된다.

 

클라이언트가 들어올 때마다 필터링의 용도로

web.xml 설정파일을 사용한다.

 

 

 

 

package site.metacoding.mvc.config;

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DBConn {

	// 이미 만들어져있는 커넥션 객체를 리턴받기 위한 메서드, DB 커넥션 코드 아님!!
	// 메서드의 책임 : Connection 객체 return
	public static Connection getConnection() {
		// 목적을 위한 객체는 전역적으로 선언
		Connection conn = null;

		try {
			Context initContext = new InitialContext();
			Context envContext = (Context) initContext.lookup("java:/comp/env"); // JNDI 박스, env는 외부환경
			DataSource ds = (DataSource) envContext.lookup("jdbc/myoracle");
			conn = ds.getConnection();
			System.out.println("DB연결 성공");
		} catch (Exception e) {
			System.out.println("DB연결 실패");
			e.printStackTrace();
		}

		return conn;
	}
}

 

 

javax로 시작하는 라이브러리는 모두 톰캣의 라이브러리이다.

잘 확인하고 import 해주자.

 

DB 연결을 위한 라이브러리도 추가해준다.

 

config는 설정파일 모아두는 곳이니까상단파일인 mvc에 서블릿파일을 만들어 테스트해보자.

package site.metacoding.mvc;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import site.metacoding.mvc.config.DBConn;

@WebServlet("/") // 어떤 요청이 들어와도 이 서블릿이 받음
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		DBConn.getConnection();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}
}

우리는 디스패치에 가면 연예인들의 정보를 알 수 있다.

클라이언트들은 이 파일로 가면 정보를 받을 수 있는것이다.

 

코드 수정만 일어나면 저장만 해도 서버 재시작 할 필요 없지만

파일 추가하고 설정 파일 수정하면 서버 종료 후 시작해주자.

 

이렇게 해도 아직 인덱스 페이지가 뜰 것이다.

 

슬래시만 입력하면 자동으로 welcome 파일로 설정해둔

index.jsp 파일로 이동하기 때문이다.

web.xml에서 웰컴파일 지워주고 서버를 다시 시작해보자!

 

오라클 포트가 연결되어있는지 확인해야한다!

 

 

 

 

 

 

 

 

[출처]

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com


메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형