JDBC, DBCP, JNDI 정리 (커넥션 풀)

Jobmania·2023년 3월 15일
0

데이터베이스

목록 보기
3/4

JDBC ( Java DataBase Connectivity)

  • Java DataBase Connectivity
    - 데이터베이스를 조작하는 표준 SQL 인터페이스 API
  • 특징
    - 인터페이스 기반으로 구축 ( 데이터베이스 커넥션 인터페이스 )
    - 이론적으로 각 DBMS에 맞는 JDBC를 받아주게 되면 쉽게 DBMS 변경 가능
    - 일반적인 JDBC는 Database Pool 방식을 사용하지 않고 DB에서 정보를 가져올 때마다 매번 디비연결을 열고 닫음
    - 따라서 매우 비효율적이기 때문에 상용 어플에서 JDBC 방식을 사용하는 경우는 거의 없다.

비효율적인 이유는 매번 요청이 올때마다 커넥션 비용이 발생하기 때문!

커넥션 비용

WAS(Web Application Server)와 데이터베이스 사이의 연결에는 많은 비용이 든다. MySQL 8.0을 기준으로 INSERT 문을 수행할 때 필요한 비용의 비율은 다음과 같다. 괄호 안의 숫자가 비율을 의미한다.

  1. Connecting (3)
  2. Sending query to server (2)
  3. Parsing query (2)
  4. Inserting row (1)
  5. Inserting index(1)
  6. Closing (1)

즉, 서버가 DB에 연결하기 위한 Connecting 비용이 가장 큰 비율을 차지한다. 이처럼 Connection을 생성하는 작업은 비용이 많이 드는 작업이다. 이를 보완할 수 있는 방법이 바로 Connection Pool이다.

DBCP(Data Base Connection Pool)

자바에서 DB에 직접 연결해서 처리하는 경우(JDBC) 드라이버(Driver)를 로드하고 커넥션(connection) 객체를 받아와야 한다. 그러면 매번 사용자가 요청을 할 때마다 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 때문에 매우 비효율적이다. 이런 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.

  • Application을 시작할 때 원하는 만큼 커넥션 객체를 만들어놓고 pool에 넣어 놓은 채 필요할 때마다 가져다 쓰고 다시 반납하는 방식
  • 다중스레드를 스레드풀로 관리하는 것과 비슷한 방식
  • 보통 Database Connection Pool을 Application 소스단에 설정해놓은 방식

예시) Tomcat Server를 설정

  1. lib에 DB에 맞는 Driver 라이브러리 의존성 추가 (mySQL 및 OracleDB Driver 추가!)

  2. 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>

커넥션 풀 속성

속성 이름설명
initialSizeBasicDataSource 클래스 생성 후 최초로 getConnection() 메서드를 호출할 때 커넥션 풀에 채워 넣을 커넥션 개수
maxActive동시에 사용할 수 있는 최대 커넥션 개수(기본값: 8)
maxIdle커넥션 풀에 반납할 때 최대로 유지될 수 있는 커넥션 개수(기본값: 8), 음수일 경우 제한이 없다.
maxTotal커넥션 풀이 제공할 최대 커넥션 갯수
minIdle최소한으로 유지할 커넥션 개수(기본값: 0)
maxWait커넥션 풀에서 가져올 수 있는 커넥션이 없을 때 대기 시간. 0보다 작을시 무한대기

maxTotal="20" maxIdle="10" maxWait="-1" 은
커넥션 풀이 제공할 최대 커넥션 갯수는 20개로써
사용되지 않고 커넥션 풀에 남아 있을 수 있는 커넥션 갯수는 0개~최대10개 까지이다.
다시말해서 최소한 10개는 커넥션 풀에 남아있으면 안되고 무조건 사용되어야 하고,
커넥션 풀에 남아 있을 수 있는 커넥션 갯수도 모두 사용되어 0개 이거나 최대 10개 까지는
사용되지 않고 사용하기 위해 대기상태로 두겠다는 뜻이다.

Datasource

  • javax.sql.DataSource라는 인터페이스는 Connection Pool을 관리하는 목적으로 사용되는 객체
  • Application에서는 이 Datasource 인터페이스를 통해서 Connection을 얻어오고 반납하는 등의 작업

JNDI (Java Naming and Directory Interface)

  • WAS단에 데이터베이스 커넥션 객체를 미리 네이밍해두는 방식
    간단히 요약하자면 우리가 연결하고 싶은 데이터베이스의 DB Pool을 미리 Naming 시켜주는 방법 중 하나이다. 우리가 저장해놓은 WAS 의 데이터베이스 정보에 JNDI를 설정해 놓으면 웹 애플리케이션은 JNDI만 호출하면 간단해진다.
  • 특징
    - DB커넥션을 WAS단에서 제어하면서 서버에서 하나의 커넥션 풀을 가짐 ( 공유객체를 사용한다고 이해하면 됨 )
    - Application이 DB에 직접 Connection을 요청하는 것이 아니라 JNDI lookup을 통해 Datasource 객체를 획득하고 그것을 Connection 요청
    - 장점 1 : DB 설정 정보를 파악하기 쉽다 > WAS단에 설정정보를 통해 디비가 몇 개 붙어있는지 정보를 파악하기 수월
    - 장점 2 : DB 커넥션 풀을 효율적으로 사용 가능
  • JNDI는 재활용을 하기 위한 코드로 부하가 발생하지 않게 하기 위해 JNDI를 써야함

DB연결과 사용!

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;		
	}

참고
참고

profile
HelloWorld에서 RealWorld로

0개의 댓글