커넥션 풀(connection pool) 종류 및 사용 예제

반응형

커넥션풀(connection pool) 이란? 
 
 
★ 처음에 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

출처 : Tong - BlueSky_07님의 Java통

반응형

이 글을 공유하기

댓글

Designed by JB FACTORY