2013년 8월 11일 일요일

스트럿츠 멀티 게시판2. 기본 설정( 1 ) - 김길재

자바 소스들은 WEB-INF/src/multiboard 패키지 밑에서 만들었습니다. 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  

우선 디비에 접속할때 쓰이는 connectionpool을 설정하는 부분입니다.

관련된 라이브 러리 파일들은 또 네이버 블로그에 올렸습니다.

http://blog.naver.com/kkjae7646

로 가시면 다운 받을 수 있습니다.

//////////////////// NewActionServlet.java //////////////////////////
package multiboard;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import org.apache.struts.action.ActionServlet;
import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.config.ModuleConfig;
//import org.apache.struts.util.RequestUtils;

//Connection Pool
import com.bitmechanic.sql.*;


public class NewActionServlet extends ActionServlet {
    private ConnectionPoolManager cpm;
   
    /*
    * poolAias는 커넥션 풀을 별칭(Alias)를 줘서 여러 개의 풀을 이용할 수 있게 해줍니다.
    * 이 값을 잘 기억하였다가 프로그램에서 실제 커넥션을 수립할때 인자로 줘야 합니다.
    */               
    private String POOL_ALIAS = "multiboard";
       
    private String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";  // driver
    private String DB_URL = "jdbc:oracle:thin:@localhost:1521:KJWINDOW"; // url
    private String DB_USER = "multiboard";      // id
    private String DB_PASSWORD = "multiboard"; // pw
   
    /* reapConnInterval은 다른 커넥션 풀들과는 틀린 부분이며 중요한
    * 옵션입니다.
    * reapConnInterval은 두가지 경우에 커넥션 풀의 connVector에서 커넥션을 제거하게 됩니다.
    * 1. 풀에서 conn이 나갔는데(checkout) checkoutTimeout 시간안에 돌아오지 않을 경우
    * 2. 풀의 connVector에서 전혀사용되지 않는 상태(idle)로 idleTimeout 시간을 초과할 경우
    * bitmechanic의  커넥션 풀은 최대 Connection 수를 설정해도  30이면 30개 커넥션이 담겨져
    * 있는 것이 아니라 상황에 따라 적절히 조정 하며 전혀 사용이 되지 않으면(Idle)수를 줄입니다.
    * 즉, maxConn이 30이어도 사용특성에 따라 몇 개만이 풀에서 운용될 수도 있다는 이야기 입니다. 
    */
    private int REAP_CONN_INTERVAL = 300; // 여기서부터는 bitmechanic 을 위한 환경 설정 값
   
    /* 커넥션 풀에 담을 수 있는 커넥션의 최대 수 */
    private int MAX_CONNECTION = 20;
   
    /* idleTimeout은  ConnectionPoolManager가 그 간격으로 수행을
    * 하게 되므로 적당한 시간을 설정하면 됩니다.
    * (데이터베이스의 불필요한 Open Session 수를 줄일 수 있슴)
    */
    private int IDLE_TIMEOUT = 60;
   
    /* checkoutTimeout은 너무 짧게 설정해도 안되는게 정상적인 query 수행시간이 길다면
    * 정상적으로 작동하는 query 수행 중에 Connection을 Reaping(제거)해 버리므로
    * 최대의 쿼리 수행 시간보다 크게 설정해야 합니다.
    * 즉 풀에서 나갔다가 돌아오는 시간의 Timeout 설정
    */
    private int CHECKOUT_TIMEOUT = 60;
   
    //Checkout의 최대 수를 지정 합니다         
    private int MAX_CHECKOUT = 15;
       
    public void init(ServletConfig config) throws ServletException
    {

            try
            {
                    Class.forName(JDBC_DRIVER);
                   
                    cpm = new ConnectionPoolManager(REAP_CONN_INTERVAL);
                   
                    cpm.addAlias(POOL_ALIAS,JDBC_DRIVER,DB_URL,DB_USER,DB_PASSWORD,MAX_CONNECTION,IDLE_TIMEOUT,CHECKOUT_TIMEOUT, MAX_CHECKOUT);
                   
                    KKJLog.info("=========================================");
                    KKJLog.info("                                        ");
                    KKJLog.info("  NewActionServlet Servlet Init... [OK]  ");
                    KKJLog.info("                                        ");
                    KKJLog.info("  [Connection Pool Init OK]            ");
                    KKJLog.info("                                        ");
                    KKJLog.info("=========================================");                   
                   
                    // connection pool 생성 후에 부모 class의 init method 연속 수행
                    super.init(config);
            }
            catch ( Exception e1 )
            {
                KKJLog.info("=========================================");
                KKJLog.info("                                        ");
                KKJLog.info("  NewActionServlet Servlet Init...[ERROR]");
                KKJLog.info("                                        ");
                KKJLog.info("  [Connection Pool Init ERROR]          ");
                KKJLog.info("                                        ");
                KKJLog.info("=========================================");
                KKJLog.info(e1.toString());                   
                e1.printStackTrace();
            }
    }   
   
}

////////////// web.xml /////////////////////////////////////////////

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>Welcome to Tomcat</display-name>
  <description>
    Welcome to Tomcat
  </description>
        <!-- Struts Tag Library Descriptors -->

        <taglib>
            <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
        </taglib>
     
        <servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>multiboard.NewActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>
       
       
        <!-- ActionServlet Mapping ====================================-->
        <servlet-mapping>
                <servlet-name>action</servlet-name>
                <url-pattern>*.do</url-pattern>
        </servlet-mapping>
           
</web-app>


다음은 스트럿츠에서의 한글 설정 부분입니다.

////////////// MyFilter.java ////////////////////////////////////////

package multiboard;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;

public class MyFilter extends RequestProcessor {
    protected boolean processPreprocess(
        HttpServletRequest request,
        HttpServletResponse response) {
       
        try {
                request.setCharacterEncoding("euc-kr");
                                       
                return true;
        } catch (Exception e) {               
                return false;                       
        }
    }
}

///////////////  struts-config.xml ///////////////////////////////////

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
     
    <!-- ========== Form Bean Definitions ================================== -->
    <form-beans>
       
     

       
    </form-beans>
   
 
    <!-- ========== Global Forward Definitions =============================== -->
    <global-forwards>
   
       
       
    </global-forwards>
   
    <!-- ========== Action Mapping Definitions =============================== -->
    <action-mappings>
       
       
    </action-mappings> 
   
    <!-- LANGUAGE SETTING  -->
    <controller
            contentType="text/html;charset=euc-kr"
            debug="3"           
            locale="true"
            nocache="true"   
            processorClass="multiboard.MyFilter"/>
           
 </struts-config>

댓글 없음:

댓글 쓰기