이클립스 + 톰캣6.0 & 5.5에서 오라클 JNDI Connection Pool 사용설정 (servlet 서블릿 설정)
아래 모든 내용은 톰캣 6.x 버전에서 해본 결과를 기본적으로 하였음
JNDI 설정 정보 링크 주소 (톰캣 6.0)
http://www.microdeveloper.com/html/JNDI_Orcl_Tomcatp2.html
위 사이트에 정보가 좋음
1. 오라클 연동 커넥션 풀 설정
자카르타 DBCP API를 이용한 커넥션 풀 사용
1) Pooling 기법
데이터베이스에 연결하기위한 Connection은 객체
많은 비용이 드는 데이터베이스 연결 객체를 매번 사용 해제하지 말고
처음 만들어둔 여러개의 데이터베이스 객체를 계속 사용하자는 개념
2) 톰캣에서 제공하는 프로그램
(1) 순서
① 자카르타 DBCP API 관련 jar 파일 설치
② DBCP 관한 정보 설정-server.xml
③ JNDI 리소스 사용설정 - web.xml
④ jsp 페이지에서 커넥션 풀 사용
(2) 설치
① http://archive.apache.org/dist/commons/에서 collections,dbcp,pool을 선택하여 다음과 같은 파일 3개를 다운로드 후 압축을 푼다
collections-current.zip
commons-dbcp-current.zip
commons-pool-current.zip
② 압축 푼 폴더에 있는 다음 파일(
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-pool-1.4.jar )
3개 파일과
오라클 설치폴더 ora92\jdbc\lib\ojdbc14.jar
이 파일 총 4개를 복사하여
톰캣홈\lib 폴더에 복사
③ DBCP에 관한 정보 설정 (conf\server.xml)
이클립스 톰캣 서버에서 server.xml 파일에 내용에 <GlobalNamingResources>내부에 추가
<GlobalNamingResources>
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" factory="oracle.jdbc.pool.OracleDataSourceFactory"maxActive="20"
maxIdle="10"
maxWait="-1"
name="jdbc/myoracle"
user="사용자ID"
password="사용자PW"
type="oracle.jdbc.pool.OracleDataSource"
url="jdbc:oracle:thin:@58.121.75.236:1521:오라클서비스이름"/>
</GlobalNamingResources>======== 톰캣 5.5 경우 server.xml 하단에 <HOST>사이에만 추가 ========
<Context docBase="프로젝트명" path="/프로젝트명" reloadable="true" source="org.eclipse.jst.j2ee.server:프로젝트명">
<Logger className = "org.apache.catalina.logger.FileLogger" prefix="localhost_JspTest_log." suffix=".txt" timestamp="true"/>
<Resource name="jdbc/myoracle"
auth="Container"
type="oracle.jdbc.pool.OracleDataSource"
user="사용자ID"
password="사용자PW"
driverClassName="oracle.jdbc.driver.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
url="jdbc:oracle:thin:@127.0.0.1:1521:오라클서비스이름"
maxActive="20"
maxIdle="10"
maxWait="-1"
removeAbandoned="true"/>
</Context>=================================================================
하단에 생기는 이 내용은 이클립스에서 톰캣서버에 프로젝트를 적용할때 자동으로 생성되므로 그냥 둔다.
<Context docBase="test01" path="/test01" reloadable="true" source="org.eclipse.jst.jee.server:test01"/>
위에 source="..." 내용때문에 경고가 날것이다.
이것은 이클립스 톰캣서버 OverView(하단에 "Servers"텝을보면 톰켓 서버상태가 보이는데 이곳을 더블클릭하면 나타나는 창 ) server Options-Publish module context to separate XML files 를 체크하고 다시 이클립스를 키면 경고는 사라진다.
④ 이클립스 WebContent\WEB-INF 폴더에 있는 web.xml파일을 열고
<web-app></web-app>사이에 추가
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
⑤ 이클립스 WebContent\META-INF 폴더에 context.xml 파일 생성 후 내용 추가
<?xml version="1.0" encoding="UTF-8" ?>
<Context>
<ResourceLink global="jdbc/myoracle"
name="jdbc/myoracle"
type="oracle.jdbc.pool.OracleDataSource"/>
</Context>
3) 컨넥션 풀 테스트 프로그램(usePool.jsp)
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/myoracle");
conn = ds.getConnection();
String sql = "select * from zipcode where dong like ? and rownum between 1 and 100";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"%소태동%");
rs = pstmt.executeQuery();
while( rs.next() ){
%>
<%= rs.getString(1) %>
<%= rs.getString(2) %>
<%= rs.getString(3) %>
<%= rs.getString(4) %>
<%= rs.getString(5) %><br />
<hr />
<%
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{ if(rs != null) rs.close(); }catch(SQLException e){}
try{ if(pstmt != null) pstmt.close(); }catch(SQLException e){}
try{ if(conn != null) conn.close(); }catch(SQLException e){}
}
%>
=======================================================================================
이클립스 + 톰캣 6.0 서블릿 설정
context.xml 파일에 ( 6.0에서만 변경한다. 보안이 어쩌고 저쩌구 하란다.. )
<Context> => <Context reloadable="true" privileged="true">
변경
web.xml 파일에
"invoker"를 검색하여 2곳에 주석을 제거 하고 이클립스를 다시 실행하면 완료
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
----------------------------------------------------
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
마지막으로 테스트 소스 ( HelloServlet.java 파일 생성 )
package test;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
res.setContentType("text/html;charset=euc-kr");
try {
PrintWriter out = res.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>Hello Servlet</Title></Head>");
out.println("<BODY>");
out.println("하하하...");
out.println("</BODY>");
out.println("<HTML>");
out.close();
}catch(Exception e){
getServletContext().log("Error in HelloServlet:",e);
}
}
}