728x90
반응형

Overview

 

jdbc를 사용하여 db에 접속하기 위해서는 드라이버를 로드하고 db에 접속하여 connection 객체를 받아와야 한다. 이런식이면 db에 쿼리를 보낼때 마다 드라이버를 로드하고 커넥션을 생성하고 닫게되는데 커넥션을 생성하고 다는데 시간이 소모되기에 동시접속자가 많은 사이트의 경우 전체의 성능을 낮추는 원인이 된다.(드라이버도 한번만 로드하면 되는데 불필요하게 여러번 로드하게 된다)

이런 문제를 해결하기 위해 "커넥션 풀"을 사용하는데 javax.sql.DataSource 를 사용하면 된다.  

 

 

1. connection pool

 

db와 연결된 커넥션을 미리 만들어서 풀(pool)속에 저장해 두고 있다가 필요할 때에 커넥션을 풀에서 가져다 쓰고 다시 풀에 반환하는 기법을 말한다. 미리 생성해두기 때문에 커넥션을 가져올 때 db에 부하를 주지않고, 다 사용한 커넥션을 반환했다가 재사용하기에 커넥션을 다시 생성할 필요가 없다. 동시 접속자가 많아서 생성된 커넥션이 부족하면 대기하게 된다.

 

[이미지 출처] http://helpwork.wordpress.com/

 

 

2. apache-tomcat7 에서 DataSource 사용하기

 

톰켓 버전에 따라 다음의 dbcp관련 라이브러리가 필요한데, 톰켓7버전이상이면 라이브러리를 추가하지 않아도 된다.

 

ex) 톰켓6버전 이면 다음의 라이버러리 추가

commons-collection-x.x.x.java

commons-dbcp-x.x.x.jar [다운로드]

commons-pool-x.x.jar [다운로드]

 

아래의 설정 방법은 다음을 참조하여 만들었다. 

http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

 

이클립스로 개발중이라면 server프로젝트아래 context.xml 파일에 다음의 내용(위 참조 사이트에서 복사)을 <Context>사이에 복사후 자신의 개발환경 설정과 맞춘다.

 

이클립스 server프로젝트의 context.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<Context>
 <Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource"

              driverClassName="oracle.jdbc.driver.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
              username="scott" password="tiger"

              maxActive="20" maxIdle="10" maxWait="-1"/>
</Context>

- maxActive의 값은 20으로 설정하였습니다. 이는 데이터베이스로의 연결이 가능한 최대 갯수
- maxIdle의 값은 10 으로 설정하였습니다. 커넥션 풀에 항상 연결상태를 유지하는 갯수
- maxWait : 발급한 커넥션의 값이 최대값에 도달했을때 요청이 들어오면 대기하는 시간(밀리초), -1이면 커넥션을 반납할때까지 기다린다

 
web.xml파일에 다음을 추가
 
/WEB-INF/web.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 
  <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>
 
</web-app>
 
DataSource를 이용한 커넥션 생성 예제
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="javax.naming.*" %>
<%@ page import ="java.sql.*" %>
<%@ page import ="javax.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<%
    Connection conn = null;
    try{
        Context initContext = new InitialContext();
        Context envContext  = (Context)initContext.lookup("java:/comp/env");
        DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
        conn = ds.getConnection();
        out.print("success!");
    }catch(Exception e){
        e.printStackTrace();
        out.print("fail!");
    }finally {
        conn.close();
    }
%>
</body>
</html>
728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,