My Books

My Slides

rss 아이콘 이미지

똘똘님 덕분에 톰캣 환경에서의 DBCP JDBC Connection Pool 구성은 쉽게 마무리했습니다. (이전 포스팅 참조) 새로운 미션은 커넥션 풀 별로 성능 현황을 모니터링하고 이력을 분석하는 것입니다. V$SESSION 뷰를 확인해보니 2개의 서비스 모두 PROGRAM 명은 'JDBC Thin Client'로 표시되고 SERVICE 명은 'SYS$USERS'로 표시되므로 구분이 되지 않습니다. DBMS_APPLICATION_INFO.SET_MODULE 패키지를 이용하면 "MODULE" 및 "ACTION" 설정이 가능하다고 알고 있습니다만, 소스 수정이 불가능한 상황입니다. 어떻게 하면 될까요?



오라클 서비스를 이용하면 아주 쉽게 이 문제를 풀 수 있습니다. 그럼 시작해볼까요?





7-1. 서비스 생성 및 시작


DB 서버에 로그인 한 후, 커넥션 풀을 위한 2개의 서비스를 생성한 후 서비스를 시작합니다. (테스트 환경은 "누구나 쉽게 따라할 수 있는 Oracle 12c RAC 설치 가이드" 참조)


SRVCTL을 이용한 서비스 생성

srvctl add service -d ORA12C -service ONLINE_SRV -preferred ORA12C1 -available ORA12C2 -failovermethod BASIC
srvctl add service -d ORA12C -service BATCH_SRV  -preferred ORA12C2 -available ORA12C1 -failovermethod BASIC


서비스 시작

srvctl start service -d ORA12C -s ONLINE_SRV
srvctl start service -d ORA12C -s BATCH_SRV


서비스 확인

srvctl status service -d ORA12C
Service BATCH_SRV  is running on instance(s) ORA12C2
Service ONLINE_SRV is running on instance(s) ORA12C1


Note
싱글 인스턴스에서 테스트를 하는 경우에는 DBMS_SERVICE 패키지를 이용해서 서비스를 생성하면 됩니다.



7-2. 커넥션 풀 별로 context.xml 파일 내의 url 변경


새로운 서비스로 접속할 수 있도록 context.xml 파일 내의 url을 변경합니다.


예시-1. 온라인 서비스용 url 변경 (/usr/local/tomcat/webapps/online/META-INF/context.xml)

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager pathname="" />
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
        <Resource
        name="jdbc/onlinesrv"
        auth="Container"
        type="javax.sql.DataSource"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(FAILOVER=ON)
             (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.81)(PORT=1521))
             (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.82)(PORT=1521)))
             (CONNECT_DATA=(SERVICE_NAME=ONLINE_SRV)(FAILOVER_MODE=(METHOD=BASIC))))"
        username="apps"
        password="apps"
        maxActive="20"
        maxIdle="10"
        initialSize="10"
        connectionPoolName="onlinesrv_pool"
        maxWait="-1"/>
</Context>


예시-2. 배치 서비스용 url 변경 (/usr/local/tomcat/webapps/batch/META-INF/context.xml)

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager pathname="" />
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
        <Resource
        name="jdbc/batchsrv"
        auth="Container"
        type="javax.sql.DataSource"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(FAILOVER=ON)
             (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.82)(PORT=1521))
             (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.81)(PORT=1521)))
             (CONNECT_DATA=(SERVICE_NAME=BATCH_SRV)(FAILOVER_MODE=(METHOD=BASIC))))"
        username="apps"
        password="apps"
        maxActive="20"
        maxIdle="10"
        initialSize="10"
        connectionPoolName="batchsrv_pool"
        maxWait="-1"/>
</Context>



7-3. 톰캣 재 시작 후 V$SESSION 뷰 확인


context.xml 설정이 완료된 후에는 톰캣을 재 시작합니다.


service tomcat stop
service tomcat start


V$SESSION 뷰를 확인해보겠습니다.


select inst_id, program, service_name from gv$session where program like 'JDBC%' order by 1;


   INST_ID PROGRAM                        SERVICE_NAME
---------- ------------------------------ ----------------------------------
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         1 JDBC Thin Client               ONLINE_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV
         2 JDBC Thin Client               BATCH_SRV


결과에서 보듯이, 서비스 설정 후에는 service_name 칼럼에 각각의 "서비스명"이 출력되는 것을 알 수 있습니다. 즉, 이를 통해 세션 레벨에서의 서비스 구분이 가능한 것을 알 수 있습니다. 그렇다면 서비스 별로 다양한 성능 통계 정보는 어떻게 확인할 수 있을까요?



7-4. 서비스 별 성능 통계 정보를 제공하는 다양한 뷰들


오라클은 V$SESSION.SERVICE_NAME 이외에도 서비스 별로 다양한 성능 통계 정보를 제공하는 뷰들을 제공하고 있습니다. 이러한 뷰들을 이용하면 서비스 별 세션 뿐 아니라 SQL, 대기이벤트, 성능통계 및 대기 클래스등의 다양한 성능 정보를 확인할 수 있습니다.


  • V$SQL : SERVICE 칼럼을 통해 서비스 별 SQL 성능 통계 확인 가능
  • V$SERVICEMETRIC : 서비스 별로 2개의 성능 통계를 제공 (1개는 최근 5초, 1개는 최근 1분)
  • V$SERVICEMETRIC_HISTORY : 서비스 별로 5초 단위의 성능 통계 이력 (최근 2분) 및 1분 단위의 성능 통계 이력 (최근 1시간) 제공
  • V$SERVICE_EVENT : 서비스 별로 대기이벤트 정보 제공
  • V$SERVICE_STATS : 서비스 별로 성능통계 정보 제공 (AWR로도 제공: DBA_HIST_SERVICE_STAT)
  • V$SERVICE_WAIT_CLASS : 서비스 별로 대기클래스 정보 제공 (AWR로도 제공: DBA_HIST_SERVICE_WAIT_CLASS)  
     

글을 마치며


서비스 별 성능 통계를 제공하는 뷰중에서 V$SERVICEMETRICV$SERVICEMETRIC_HISTORY 뷰는 조금 더 학습이 필요할 것 같습니다. 다음 포스팅은 해당 뷰들에서 제공하는 데이터의 내용을 분석할 예정입니다.


[08] V$SERVICEMETRIC, V$SERVICEMETRIC_HISTORY 뷰를 이용한 서비스 성능관리 방안 으로바로가기



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

안녕하세요. 똘똘님! 이번 미션은 톰캣 JDBC Connection Pool을 설정하는 것입니다. 커넥션 풀을 이용해보기는 했지만, 제가 직접 구성을 하려니 막막합니다. 톰캣 7 설치, JDK 1.7 설치까지는 쉽게 했지만, 커넥션 풀을 설정하는 부분에서 헤매고 있습니다. 구글링을 해보면 Server.xml, Context.xml, Web.xml 등 환경 파일 내에 설정 정보를 넣어주면 쉽게 된다고 하는데, 잘 되지 않습니다. 그리고 커넥션 풀을 이용한 JSP 샘플 코드를 작성해보고 싶은데, 이 역시 쉽지 않습니다. 알려주세요. 똘똘님!



제가 WAS 전문가는 아니지만, 말씀하신 부분은 도움을 드릴 수 있을 것 같습니다. 그럼 시작해볼까요?



6-1. 개요


 
DB Connection Pool (이하 DBCP)톰캣 JDBC Connection Pool을 설정하는 방법은 아주 간단합니다. context.xml 파일에만 적절한 정보를 입력하면 됩니다. 아주 쉽죠? 그럼, 온라인 서비스와 배치 서비스 각각을 위한 커넥션 풀을 설정하는 예제를 통해서 설명하도록 하겠습니다.


Note
참고로, 톰캣 6부터는 web.xml 파일에 <resource-ref> 항목을 등록하지 않아도 됩니다.

 


6-2. 서비스를 위한 디렉토리 생성



cd /usr/local/tomcat  -- 설치 디렉토리로 이동
cd webapps
mkdir -p online/META-INF
mkdir -p batch/META-INF



6-3. 각 서비스의 META-INF 디렉토리 내에 context.xml 생성



예시-1. /usr/local/tomcat/webapps/online/META-INF/context.xml 내용

<?xml version='1.0' encoding='utf-8'?>
<Context>

    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager pathname="" />
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
 
 <Resource
        name="jdbc/onlinesrv"
        auth="Container"
        type="javax.sql.DataSource"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@192.168.56.81:1521:ORA12C1"
        username="apps"
        password="apps"
        maxActive="20"
        maxIdle="10"
        initialSize="10"
        connectionPoolName="onlinesrv_pool"
        maxWait="-1"/>
 
</Context>


예시-2. /usr/local/tomcat/webapps/batch/META-INF/context.xml 내용

<?xml version='1.0' encoding='utf-8'?>
<Context>

    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager pathname="" />
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
 
 <Resource
        name="jdbc/batchsrv"
        auth="Container"
        type="javax.sql.DataSource"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@192.168.56.82:1521:ORA12C2"
        username="apps"
        password="apps"
        maxActive="20"
        maxIdle="10"
        initialSize="10"
        connectionPoolName="batchsrv_pool"
        maxWait="-1"/>
 
</Context>


Note
오라클 11g부터는 사용자 비밀번호의 대소문자를 구별합니다. 따라서, 대소문자를 구별해서 정확한 비밀번호를 password 항목을 입력하도록 합니다. 참고로, 비밀번호 대소문자를 구별하지 않으려면 sec_case_sensitive_logon 파라미터를 false로 변경하면 됩니다.



6.4 톰캣 서버 재시작 후 DB 서버에서 커넥션 풀 접속 확인




service tomcat stop
service tomcat start


Note
톰캣 서버를 service 방식으로 start/stop 하는 방법은 "여기"를 참고하세요.


select inst_id, username, to_char(logon_time,'YYYY:MM:DD HH24/MI/SS') logontime , program, service_name
from gv$session
where username='APPS'
and program like 'JDBC%'
order by 1,3;


   INST_ID USERNAME   LOGONTIME            PROGRAM            SERVICE_NAME
---------- ---------- -------------------- ------------------ ---------------
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         1 APPS       2016:06:28 15/52/25  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS
         2 APPS       2016:06:28 15/52/23  JDBC Thin Client   SYS$USERS


Note
initialSize를 10으로 설정했으므로, RAC 1,2번 노드 각각 10개의 세션이 연결된 것을 확인할 수 있습니다.



6.5 샘플 JSP 코드 작성



DBCP커넥션 풀이 생성된 상태이므로, 커넥션 풀의 커넥션 객체를 이용해서 DB에 접속하는 JSP 샘플 코드를 작성해보도록 하겠습니다.


예시-3. /usr/local/tomcat/webapps/online/test.jsp의 내용

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<html>
<head>
<body >
<%
        String v1 = null;

        try {
                Context initContext = new InitialContext();
                Context envContext  = (Context) initContext.lookup("java:/comp/env");
                DataSource datasource = (DataSource) envContext.lookup("jdbc/onlinesrv");
                Connection conn = datasource.getConnection();

                Statement st=conn.createStatement();
                String sql = "select 'Welcome! Tomcat DB Connection Pool (DBCP)' from dual";
                ResultSet rs = st.executeQuery(sql);
                rs.next();
                v1 = rs.getString(1);
        } catch (Exception e){
                e.printStackTrace(System.out);
        }
%>
        <%=v1 %>

</body>
</html>


Note
샘플 코드에서 가장 중요한 부분은 envContext.lookup 부분에 context.xml 에 설정한 name을 입력한다는 것입니다. 예를 들어, 온라인 서비스 커넥션 풀 객체를 이용하려면 "jdbc/onlinesrv"를 입력하면 되고 배치 서비스 커넥션 풀 객체를 이용하려면 "jdbc/batchsrv"를 입력하면 됩니다.


웹 브라우저를 이용해서 샘플 JSP를 실행하면 다음과 같은 결과를 확인할 수 있습니다.




똘똘님 덕분에 DBCP 커넥션 풀 구성 및 JSP 샘플 코드 작성을  쉽게 완료했습니다. :)



네. 궁금님. 그럼 다음 시간에는 DBCP 커넥션 풀 환경에서 "서비스"를 이용한 성능 관리에 대해서 살펴보도록 하겠습니다.



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
TAG DBCP, 톰캣


 

티스토리 툴바