상세 컨텐츠

본문 제목

ConnectionPool 정의 & 설정하기

프로그래밍/JAVA

by 라제폰 2009. 6. 17. 11:03

본문


<<ConnectionPool>>

 시스템에 성능 향상
--> 미리 컨넥션을 생성
client 접속시 빌려주고 사용후 반납 받는 형식

 

--------------------------------------------------------------------------------------------
 설정하기.
--------------------------------------------------------------------------------------------
Tomcat5.5, Oracle 9.2.0.1 Datasource 설정법
1.conf/server.xml파일을 열고 <GlobalNamingResources>엘리먼트 안에 다음 내용 추가.
 <Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@localhost:1521:xe"
              username="scott" password="tiger" maxActive="20" maxIdle="10"
              maxWait="-1"/>

2. conf/context.xml에 추가
  <ResourceLink global="jdbc/myoracle" name="jdbc/myoracle" type="javax.sql.DataSource"/>

3. ojdbc14.jar 파일을 oracle.com 사이트에서 다운로드하고 Tomcat/common/lib/안에 복사

4. Tomcat5.5 다시 실행

5. 위와 같이 설정이 완료되었으면 이 파일을 실행하여 결과가 출력되는지 확인한다.
6. 설정 및 테스트 끝
step7/ index.jsp에서 붙여넣고 확인하기 (설정후 톰켓 다시 시작하기!!!!)

<%@ page contentType="text/html;charset=KSC5601"%>
<%@ page import="java.sql.*, javax.naming.*, javax.sql.*"%>
<HTML>
  <HEAD><TITLE></TITLE>
  </HEAD>
  <BODY><CENTER>
  <%
      Context initCtx = new InitialContext();
      DataSource ds =  (DataSource)initCtx.lookup("java:comp/env/jdbc/myoracle");
      Connection conn = ds.getConnection();
      Statement stmt = conn.createStatement();
      String query = "select*  from member";
      ResultSet rs = stmt.executeQuery(query);
      while(rs.next()) {
        out.println(rs.getString(1)+"<br>");
      }
      rs.close();
      stmt.close();
      conn.close();
  %>
</CENTER>
</BODY>
</HTML>

 

 


 

 커넥션풀(connection pool) 이란?
 
★ 처음에 DB에 접속하는 과정이 가장 부하가 많이 걸린다.

getConnection() 할 때 부하가 가장 크다. 그래서 나온게 Connection Pool.

Connection Pool 이란, DB에 접근할 때마다 연결을 했다 끊었다 하는게 아니라,

자바 프로그램에서 미리 몇 개의 연결을 해 놓은 후 - 이게 Connection Pool -

필요할 때마다 Pool에서 연결을 빌려와서 사용한 후, 다시 돌려준다. - 끊는게 아니다.

Pool을 너무 크게 해놓으면 - 연결을 너무 많이 해 놓으면 - 메모리의 소모가 크고,

너무 적게 해놓으면 대기하는 시간이 길어진다.

적당한 크기로 설정해야 한다. 웹사이트에 걸리는 부하에 따라 조정해야 한다.

★ Connection Pool 을 사용하는 방법

① 인터넷 상에 공개된 소스

  DBConnectionMgr.java - 별로라는데...?

② Oracle Connection Pool

  오라클에서 제공하는 드라이버에만 있는 것. 오라클에 쓰기에는 좋다.

③ Tomcat WAS - DBCP

 


 

- ConnectionPool : 미리 준비해 놓은 connection의 집합

- DataSource :  connection생성, 삭제, 대여, 반납

- 사용법 : 1. 개발자가 구현

  2. WAS(WebApplicationServer) ServletContainer에서 제공

  3. 데이터베이스에서 제공

 

- ※ context.xml에서...

- maxIdle : 최소 Connection수 -> 10

- maxActive : 최대 Connection수 -> 100

- maxWait : 클라이언트의 최대 대기 시간 -> 180  (->15분)/(1->5초)

- 반납이 안되고 있는 connectin처리

- removeAbandoned = true

; 반납이 안되고 이쓴 connection삭제 여부(true:삭제)

- removeAbandoned Timeout= 60

; 반납이 안되는 Connection이라고 DataSource가 판단시간 1->5초, 60->5분 

- logAbandoned = true

; 반납이 안된 Connection 삭제 시 로그파일에 기록을 남길것인가 여부(true:남기겠다)

 

- ※ JDNI(Java Naming&Directory Interface)...

- DataSource객체의 주소가 저장되어 있는 객체

 

- 중요구문;

Context initContext = new InitialContext();

Context envContext = (context)initContext.lookup("java/comp/env");

DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");

ds.getConnection(0;

con.close();

 

 

=================context.xml=======================================

<?xml version="1.0"  encoding="euc-kr"?>

<Context docBase="dbcptest"
    path="/dbcptest"  reloadable="true"> <!-- docBase:폴더, path:url, 변경사항 있을시 자동갱신true -->
<Resource name="jdbc/oracle"   <!--커넥션 객체가 뭐냐~   name:데이타소스명-->
   auth="Container"                      <!--auth:관리 -->
   type="oracle.jdbc.pool.OracleDataSource"  <!--type:DataSource 타입-->
   driverClassName="oracle.jdbc.driver.OracleDriver"  
   factory="oracle.jdbc.pool.OracleDataSourceFactory"   <!-- context.xml보고 factory생성 하고 DataSource생성 -> context.xml보고 DataSource가 ConnectionPool생성(몇개 생성, 얼마나 대기, 최대대기시간 등의 정보 참조) -> JNDI(Java Naming&Directory Interface)객체통해 lookup(객체명) 으로  Reference리턴-->
   url="jdbc:oracle:thin:@localhost:1521:XE"
   user="scott"
   password="tiger"
  
   maxActive="100"  <!--maxActive, maxIdle, maxWait는 connectin관리 설정-->
   maxIdle="10"
   maxWait="180"
  
   removeAbandoned="true"
   removeAbandonedTimeout="60"
   logAbandoned="true"
   />
</Context>

==================DBCPServlet2.java=========================================

package net.bitacademy.dbcp;

import! java.io.IOException;
import! java.io.PrintWriter;

import! javax.servlet.ServletException;
import! javax.servlet.http.HttpServlet;
import! javax.servlet.http.HttpServletRequest;
import! javax.servlet.http.HttpServletResponse;

import! javax.sql.DataSource;

import! java.sql.Connection;
import! java.sql.PreparedStatement;
import! java.sql.ResultSet;
import! java.sql.SQLException;

import! javax.naming.Context;
import! javax.naming.InitialContext;
import! javax.naming.NamingException;

public class DBCPServlet2 extends HttpServlet {
 private static final long serialVersionUID = 1L;
 
    public DBCPServlet2() {
        super();
     }

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  Context initialContext=null;
  Context envContext = null;
  DataSource ds = null;
  try{
   initialContext = new InitialContext();
   envContext=(Context)initialContext.lookup("java:/comp/env");
   ds = (DataSource)envContext.lookup("jdbc/oracle");   
  }catch(NamingException e){
   e.printStackTrace();
  }
  Connection con = null;
  PreparedStatement ps = null;
  ResultSet rs = null;
  try{
   con=ds.getConnection();
   String sql = "SELECT * FROM student";
   ps = con.prepareStatement(sql);
   rs = ps.executeQuery();   /*요거 빠뜨리니 안되지~*/

 
   PrintWriter out = response.getWriter();
   while(rs.next()){
//을 db첨부터 끝까지 가져와
    out.println("<h1>" + rs.getString(1));    //db의 첫번째 칼럼(num)인 학번을 브라우저에 출력준비
    out.flush(); //브라우저에 출력
   }
   out.close();
  }catch(SQLException e){
   e.printStackTrace();
  }finally{
   if(rs != null)
    try{
     rs.close();
    }catch(SQLException e){
     e.printStackTrace();
    }
   if(ps != null)
    try{
     ps.close();
    }catch(SQLException e){
     e.printStackTrace();
    }
   if(con != null)
    try{
     con.close();        //반납
    }catch(SQLException e){
     e.printStackTrace();
    }
  }
 }

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

 }

}

 


 

 

 

 

 

 

 

 

관련글 더보기