★ 처음에 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 |