WEB/✿JSP

[JSP] 🔗JDBC와 커넥션 풀

W_W_Woody 2022. 1. 15. 18:23

 JDBC (Java Database Connectivity)

자바에서 DB 프로그래밍을 하기 위해 사용되는 API
JDBC API 사용 어플리케이션의 기본 구성
SQL문과 DB사이에 매개가 되는게 JDBC

 

 

 

 

 

 

커넥션 풀(Connection Pool) 

 * 풀은 벡터구조로 만들어지는데 커넥션을 담아놓는다. 

데이터베이스와 연결된 커넥션을 미리 만들어서
풀(pool) 속에 저장해 두고 있다가 필요할 때에 커넥션을 가져다 쓰고, 다시 풀(pool)에 반환하는 기법을 의미

 

- 데이터베이스 연동 프로그램의 문제점

 

데이터베이스에 연결하기 위해서 매번 커넥션(Connection) 객체를 생성할 때는 많은 시스템 자원이 요구됨.

(객체 메모리 적재시 메모리에 객체를 할당할 자리 생성, 초기화 작업, 객체 미사용시 객체를 삭제하는 작업 등등)

 

이 때 커넥션 풀을 사용하여 문제를 해결할 수 있다.

 

- 커넥션 풀의 장점

1) 풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는데 시간이 소비되지 않음

2) 커넥션을 재사용하기 때문에 생성되는 커넥션 수가 많지 않음

3) 커넥션을 생성하고 제거하는데 필요한 시간이 소요되지 않기 때문에 어플리케이션의 실행 속도가 빨라지며

한번에 생성될 수 있는 커넥션 수를 제어하기 때문에 동시 접속자 수가 많아도 웹 어플리케이션이 쉽게 다운되지 않음

일반적으로 커넥션을 만들지 않는다. 짧은 시간 내에 성능이 좋은 커넥션을 만들수 없기 때문이다.

 

그렇기에 잘 만들어져있는 커넥션을 가져다쓰는데, 그 중 하나가 자카르타DBCP API이다.

 

요즘엔 톰캣에 커넥션 풀이 내장되어있기 때문에 별도의 구성없이도 톰캣이 커넥션 풀을 제공하기 때문에,

설정을 따로 할 필요가 없고 간단하게  context.xml (설정파일) 만 만든다.

동작이 될 수 있도록 META-INF 파일 하위에 넣어준다.

 

호출하는 방법은 JNDI를 이용한다.

 

-  자카르타 DBCP API와 JNDI를 이용한 커넥션 풀 사용하기

(1) 자카르타 DBCP API 와 DataSource 

 컨넥션 풀을 사용하기 위해 아파치 그룹에서 제공하는 자카르타 DBCP 이용.

자카르타의 DBCP는 커넥션 풀링 기능을 제공하고 사용되지 않는 커넥션을 해제시켜주는 기능도 포함.

 

(2) JNDI (Java Naming and Directory Interface)

사용자가 원하는 리소스/서비스를찾기 위한 방법 등록하고 DBCP API를 이용한 커넥션 풀을 구성할 때,

(데이터 베이스 커넥션에 대한 정보를 자바코드에 직접 하드 코딩하는 것 보다는)

외부파일에 실제 정보를 기록해 두고 자바코드에는 그 정보를 읽어올 수 있는 name(이름값, 식별자)만을 기록해두면

→ 데이터 베이스에 대한 정보가 변경된다 하더라도 모든 자바코드를 수정하는 것이 아니라 해당 정보를 기록해 놓은 외부파일만 수정하면 되기 때문에 간편하게 사용할 수 있다.

 

- context.xml

이 <Resource>안의 정보들은 JNDI방식으로 읽는다
읽어온 정보들을 통해서 커넥션 풀로부터 커넥션을 할당 받는데,
커넥션 풀에 접근할 권한을 가진 객체가 DataSource 이다. (= 커넥션을 얻어오는 역할)

DAO에서 "jdbc/xe"명칭으로 <Resource>안의 정보들을 읽어오고 반환 타입은 javax.sql.DataSource으로
반환하여 커넥션 풀에 접근할 수 있도록 처리를 해준다.

jdbc/xe : 데이터베이스 연동하기 위해 사용 되는 라이브러리 이름 /  ORACLE의 XID ( uinque한 값)

http://wiki.gurubee.net/pages/viewpage.action?pageId=6259836


<?xml version="1.0" encoding="UTF-8"?>
<Context>
     <Resource name="jdbc/xe→  DAO에서 읽어올 명칭
              auth="Container"  → Container를 자원관리자로 기술
              type="javax.sql.DataSource"  →  반환 타입은 javax.sql.DataSource으로 
              username="scott"
              password="tiger"
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@localhost:1521:xe"
              maxTotal="20"  → 톰캣이 제공하는 커넥션 풀에서 생성되는 최대 커넥션 숫자를 명시
              maxIdle="10" />  →   데이터베이스 연동이 없더라도 커넥션 풀 유지를 위한 최대 대기커넥션 숫자
</Context>

- DataSource : javax.sql.DataSource

 데이터베이스에 접근하기 위한 표준 인터페이스, 특히 DBCP를 이용하기 위한 표준방식

 

 DAO에서

커넥션 객체를 읽어오기 위해서는,  식별자 를 이용해서 리소스/서비스를 찾는다. 

 

(5) 코딩 예

 

Context initCtx = new InitialContext();  

Context envCtx = (Context) initCtx.lookup("java:comp/env");

DataSource ds = (DataSource)envCtx.lookup("jdbc/java");

Connection conn = ds.getConnection();

또는

Context initCtx = new InitialContext();  

DataSource ds = (DatSource) initCtx.lookup("  java:comp/env/ jdbc/java ");

Connection conn = ds.getConnection();

 

 


(4) Eclipse Dynamic Web Project 에서 DBCP API를 이용한 커넥션 풀 설정

 

- 자카르타(Jakarta) DBCP API 관련 jar 파일 설치 (jakarta.apache.org)

 

commons-collections-3.1.jar

commons-dbcp-1.2.1.jar

commons-pool-1.2.jar

 

설치 위치 :작업하고 있는 프로젝트>WEB-INF>lib 에 상기 jar파일을 설치함

 

- 데이터베이스 설정 및 컨넥션 풀 설정 정보 기록

 

설치 위치 : 컨텍스트>META-INF 에 context.xml 생성

 

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

<Context >

 

 <Resource name="jdbc/java"

  auth="container"

  type="javax.sql.DataSource"

  username="scott"

  password="tiger"

  driverClassName="oracle.jdbc.driver.OracleDriver"

  factory="org.apache.commons.dbcp.BasicDataSourceFactory"

  url="jdbc:oracle:thin:@localhost:1521:java"

  maxActive="100"

     maxIdle="10" />

</Context>

 

- web.xml 파일에 추가 될 내용

 

   컨텍스트>WEB-INF/web.xml 파일을 열어 web-app의 하위 요소로 아래와 같이 추가 기재

 

   <web-app>

 

      <resource-ref>

      <description>DB Connection</description>

      <res-ref-name>jdbc/java</res-ref-name>

      <res-type>javax.sql.DataSource</res-type>

      <res-auth>Container</res-auth>

     </resource-ref>

 

   </web-app>