[JDBC] 04 JDBC - Connection Pool...

프로그래밍/DB 2007. 11. 27. 13:55 Posted by galad

★ 처음에 DB에 접속하는 과정이 가장 부하가 많이 걸린다.

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


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

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

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


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

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

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


★ Connection Pool 을 사용하는 방법

① 인터넷 상에 공개된 소스

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

② Oracle Connection Pool

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

③ Tomcat WAS - DBCP


/*******************************************************************************************
*   파일        : DBConnectionPoolClient.java
*   용도        : 오라클이 제공하는 ConnectionPool을 사용한 예제
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

package ConnectionPool;

import java.sql.*;

import javax.sql.*; // 오라클의 Connection Pool 기능은 여기에 들어있다.
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;

public class DBConnectionPoolClient
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        try
        {
            OracleConnectionPoolDataSource ocpds = new OracleConnectionPoolDataSource();
           
            ocpds.setURL("jdbc:oracle:thin:@61.109.232.128:1521:ora92");
            ocpds.setUser("scott");
            ocpds.setPassword("tiger");
           
            // Connection Pool 생성
            PooledConnection pc = ocpds.getPooledConnection();
           
            Connection con = null;
            PreparedStatement pstmt = null;
            String sql = "select * from emp";
            ResultSet rs = null;
           
            // 강제로 무한루프 - Connection Pool을 테스트한다.
            while(true)
            {
                // Pool 에서 하나 빌려온다.
                con = pc.getConnection();
                pstmt = con.prepareStatement(sql);
                rs = pstmt.executeQuery(); //질의문 수행
               
                while (rs.next())
                {
                    String str = "empno: " + rs.getInt("empno") + "\t"

                                  + "ename: " + rs.getString("ename");
                   
                    System.out.println(str);
                }
               
                // close지만 실제로 연결을 끊는게 아니라 Pool에 돌려준다.
                con.close();
            }
        }
        catch(Exception e)
        {}

    }

}



/*******************************************************************************************
*   파일        : DBConnectionPoolClient.java
*   용도        : 오라클이 제공하는 ConnectionPool을 사용한 예제와
*                   인터넷에서 구할 수 있는 Connection Pool을 관리해주는 클래스인 DBConnectionMgr을 이용한 예제
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

package ConnectionPool;

import java.sql.*;
import javax.sql.*; // 오라클의 Connection Pool 기능은 여기에 들어있다.
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;

public class DBConnectionPoolClient
{
    // Oracle Connection Pool을 쓸 것인가 DBConnectionMgr Class를 쓸 것인가
    public static final boolean IsUsedOCPDS = false;

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        OracleConnectionPoolDataSource ocpds = null;
        PooledConnection pc = null;
       
        DBConnectionMgr mgr = null;
       
        Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = "select * from member";
        ResultSet rs = null;
       
        try
        {
            if(IsUsedOCPDS)
            {
                ocpds = new OracleConnectionPoolDataSource();
               
                ocpds.setURL("jdbc:oracle:thin:@61.109.232.128:1521:ora92");
                ocpds.setUser("lonelycat");
                ocpds.setPassword("ora123");
               
                // Connection Pool 생성
                pc = ocpds.getPooledConnection();
            }
            else
            {
                mgr = DBConnectionMgr.getInstance();
            }
           
            // 강제로 무한루프 - Connection Pool을 테스트한다.
//            while(true)
//            {
                if(IsUsedOCPDS)
                {

                    // Pool 에서 하나 빌려온다.
                    conn = pc.getConnection();
                }
                else
                {
                    conn = mgr.getConnection();
                }
               
                pstmt = conn.prepareStatement(sql);
                rs = pstmt.executeQuery(); //질의문 수행
               
                while (rs.next())
                {
                    String str = "ID: " + rs.getString("id") + "\t" + "Name: " + rs.getString("name");
                   
                    System.out.println(str);
                }
               
                // close지만 실제로 연결을 끊는게 아니라 Pool에 돌려준다.
                conn.close();
               
                if(!IsUsedOCPDS)
                    mgr.freeConnection(conn);
//            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}


★ 파일명이 이상하게 들어갔지만, 원래 이름은

Pool.properties

DBConnectionMgr.java

이다.

'프로그래밍 > DB' 카테고리의 다른 글

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27
[JDBC] 01 JDBC 시작  (0) 2007.11.27