[Servlet] DBCP(Database Connection Pool)를 사용한 DB 연결
앎/web 2014. 3. 11. 16:44 |웹 프로그램에서는 데이터베이스의 환경 설정과 연결 관리등을 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 객체 정보를 확인하자.
'앎 > web' 카테고리의 다른 글
[Servlet] 서블릿 필터(Servlet Filter) (0) | 2014.03.13 |
---|---|
[Servlet] MIME 형식별 데이터 처리 (0) | 2014.03.12 |
[Servlet] 웹 프로그램에서의 파일 업로드(File Upload) (0) | 2014.03.11 |
[Servlet] 서블릿에서의 파일 I/O (0) | 2014.03.10 |
[Servlet] 쿠키 (Cookie) (0) | 2014.03.08 |