프로그래밍/JSP

이클립스 + 톰캣6.0 & 5.5에서 오라클 JNDI Connection Pool 사용설정 (servlet 서블릿 설정)

긍정적코알라 2012. 1. 2. 17:05

아래 모든 내용은 톰캣 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);
    }
  }
}