<<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 {
}
}