웹 프로그램에서는 데이터베이스의 환경 설정과 연결 관리등을 XML 파일이나 속성 파일을 사용하여 관리하고 특정 이름을 사용하여 이 정보를 얻어온다. 

웹에서 불특정 다수의 사용자가 DB연결을 요청한다고 무작정 허용한다면 DBMS는 부하를 감당할 수 없을 것이다.

따라서 연결 개수를 설정하여 현재 연결된 사용자가 더 이상 Connection 객체를 사용하지 않을 경우 해당 Connection 객체를 반환받아서 다른 사용자에게 할당해야 한다. 이런 작업을 Connection Pooling이라 하고 DBCP(Database Connection Pooling)이라 부른다. 


여기서는 톰캣의 DBCP(Database Connection Pool)를 사용하여 DBMS Connection 객체를 생성, 사용하는 방법에 대해 알아본다.


프로젝트의 META-INF 디렉터리 내에 Context.xml을 생성한다.

Context.xml은 해당 Context에서 사용할 리소스를 등록하는 곳이다. 

다음과 같이 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/myconn"
            auth="Container"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
            driverClassName="org.gjt.mm.mysql.Driver"
            url="jdbc:mysql://localhost:3306/데이터베이스명?AutoReconnect=true"
            username="계정"
            password="암호"
            maxActive="100"
            maxIdle="30"
            maxWait="60"
            removeAbandoned="true"
            removeAbandonedTiemout="60"/>
</Context>

속성

설명 

 name

 JNDI로 호출될 이름

 auth

 DBCP를 관리할 관리자. Container or Application 

 type

 해당 리소스의 Return Type. DataSource는 Connection 객체를 반환할 수 있다.

 factory

 DBCP를 관리하는 클래스

 driverClassName

 JDBC를 이용하기 위한 드라이버 클래스

 url

 DB 접속 URL. 해당 속성으로 자동 재접속을 설정했다.

 username

 DB 계정명

 password

 계정 비밀번호

 maxActive

 최대 접속 허용 개수

 maxIdle

 DB Pool에 여분으로 남겨질 최대 Connection 개수

 maxWait

 DB 연결이 반환되는 Timeout 최대 시간

 removeAbandoned

 Connection이 잘못 관리되어 버려진 연결을 찾아 재활용할 것인지 여부 설정

 removeAbandonedTimeout

 버려진 연결로 인식할 기본 시간 설정. 초 단위.


이렇게 설정된 정보 객체를 이름으로 얻으려면 자바의 네이밍 API를 사용해야 한다. 이를 JNDI라고 하는데 

JNDI(Java Naming and Directory Interface)는 이름을 사용하여 데이터 및 객체를 찾을 수 있도록 도와주는 디렉토리 서비스에 대한 Java API이다. 


web.xml에 JNDI로 정의할 이름을 등록한다. <welcome-file-list> 태그 위에 작성한다.

  <resource-ref>
    <description>MySQL Resource</description>
    <res-ref-name>jdbc/myconn</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>


서블릿을 작성하고 web.xml에 매핑해준다.

ConnectionServlet.java

package com.study;

import java.io.IOException;
import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class ConnectionServlet extends HttpServlet {
	public void service(HttpServletRequest _request, HttpServletResponse _response) 
			throws IOException, ServletException {
		try {
			Context context = new InitialContext();
			/* JNDI 이름은 java:comp/env에 등록되어 있다. 
			   따라서 예약어로 "java:comp/env"가 오고 그 다음 
			   Context.xml의 name으로 설정한 내용을 쓰면 된다. */
			DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/myconn");
			Connection conn = ds.getConnection();
			
			System.out.println("conn: " + conn);			
		} catch(Exception _ex) {
			System.out.println("Error: " + _ex.getLocalizedMessage());			
		}
	}
}

web.xml

  <servlet>
    <servlet-name>ConnectionServlet</servlet-name>
    <servlet-class>com.study.ConnectionServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>ConnectionServlet</servlet-name>
    <url-pattern>/DBConnect.do</url-pattern>
  </servlet-mapping>  


실행해서 Connection 객체 정보를 확인하자.



Posted by 후니아부지
: