weblogic datasource활용한 connection pool

출처:http://blog.naver.com/dains/50039888669

[01] ConnectionPool의 생성 및 환경 설정

   - Connection 객체를 미리 생성하여 속도향상을 가져옵니다.
   - 많은 접속자수로 인해 서버의 리소스가 바닥나지 않도록 관리할 수 있습니다.
   - 데이터베이스 연결이 설정되어 있는 connection 객체를 가지고 있습니다.

   - http://127.0.0.1:7001/console


1. JDBC Thin Driver Connection Pool의 등록
   - Services -- JDBC -- Connection Pools에서 설정합니다.

   - Name         : Oracle Connection Pool
   - Database Name: ora10g2            (SID 이름 지정)
   - Host Name    : 172.16.11.1        (Oracle Server의 IP)
   - Port         : 1521
   - Database User Name: ejb2030_04_1
   - Password     : oracle
 

2. Thin DataSource 생성 및 환경설정
   - Services -- JDBC -- Data Sources에서 설정합니다.
   - Name: Oracle Data Source
   - JNDI Name: ora10g2
   - Pool Name: Oracle Connection Pool


3. XA Connection Pool의 등록
   - Name         : OracleXA Connection Pool
   - Database Name: ora10g2              (SID 이름 지정)
   - Host Name    : 172.16.11.1          (Oracle Server의 IP)
   - Port         : 1521
   - Database User Name: ejb2030_04_1
   - Password     : oracle
   - Name         : OracleXA2 Connection Pool
   - Database Name: ora10g2(SID 이름 지정)
   - Host Name    : 172.16.11.1
   - Port         : 1521
   - Database User Name: ejb2030_04_1
   - Password     : oracle
 

4. XA DataSource 생성 및 환경설정
   - Name: OracleXA Data Source
   - JNDI Name: ora10g2xa
   - Pool Name: OracleXA Connection Pool
   - Name: OracleXA2 Data Source
   - JNDI Name: ora10g2xa2
   - Pool Name: OracleXA2 Connection Pool


[02] Weblogic상에서의 Connection Pooling 실습 

1. C:/bea/user_projects/domains/ejb/startWebLogic.cmd 파일 38번째 라인 부근 수정
   - false, true사이에 공백을 절대 삽입하지 말것, 서블릿이나 JSP를 수정했을 때 자동으로 수정된 파일을 적용받을 수 있게 설정
   set PRODUCTION_MODE=false 로 변경하고 개발이 완료되면 set PRODUCTION_MODE=true 로 변경합니다.


2. 폴더 구조 생성
   - C:/bea/user_projects/domains/ejb/applications/web/pool                
     . html, jsp 파일이 저장됨
   - C:/bea/user_projects/domains/ejb/applications/web/WEB-INF
     . web.xml, weblogic.xml 환경설정 파일
   - C:/bea/user_projects/domains/ejb/applications/web/WEB-INF/classes
     . Servlet, Beans가 저장됨
   - C:/bea/user_projects/domains/ejb/applications/web/WEB-INF/lib  
     . jar파일 같은 라이브러리 파일이 저장됨

   - 서버에 등록한 Application이 인식이 안될경우 http://127.0.0.1:7001/console에서 등록하면 정상적으로 실행 할 수 있습니다.


3. Web Application 환경 설정 파일 생성
   - weblogic서버가 실행되고 있는 가운데 xml파일을 수정하면 weblogic서버를 재시작하거나 console에서
     redeploy를 실행합니다.

>>>>> C:/bea/user_projects/domains/ejb/applications/web/WEB-INF/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>Weblogic 8.1 Connection Pool</display-name>
  <description>
     Weblogic 8.1 Connection Pool
  </description>

  <!-- 시작 파일 목록 지정 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>


4. Weblogic Web Application 환경 설정 파일 생성
   - <context-root>태그의 값으로 "_"를 붙이면 안됩니다.

>>>>> web/WEB-INF/weblogic.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">

<weblogic-web-app>
<charset-params>
  <input-charset>
  <resource-path>/*</resource-path>
  <java-charset-name>KSC5601</java-charset-name>
  </input-charset>
</charset-params>

    <!-- URL 접근 경로 이름        -->
    <!-- http://127.0.0.1:7001/ejb1830 -->
    <context-root>/ejb1830</context-root>

</weblogic-web-app>



5. web application의 수동 배포
   - web application이 인식이 안되면 weblogic console에서
     'Deployments' -- 'Web Application Modules'을 등록해 줍니다.
   - 웹로직 서버에 등록되는 jsp임으로 웹로직 서버의 위치 정보가 필요 없습니다.



6. Oracle10g에 추가된 기능
   ⓐ 테이블을 오라클 휴지통으로 이동합니다.
   DROP TABLE handphone;

   ⓑ 삭제한 테이블을 복구합니다. 
   FLASHBACK TABLE handphone TO BEFORE DROP;

   ⓒ 테이블을 휴지통으로 이동하지 않고 완전히 삭제합니다.
   DROP TABLE handphone PURGE;

   ⓓ 오라클 휴지통을 비웁니다.
   PURGE RECYCLEBIN;


   ⓔ 테이블 구조
   CREATE TABLE handphone(
        num      NUMBER(5)     NOT NULL,
        name    VARCHAR(20) NOT NULL,
        vender  VARCHAR(20) NOT NULL
   )

   ⓕ 임시영역에서 데이터를 저장합니다.
   INSERT INTO handphone(num, name, vender)
   VALUES(1, 'LG', 'LG텔레콤');
   INSERT INTO handphone(num, name, vender)
   VALUES(2, 'anycall', 'SAMSUNG');
   SELECT * FROM handphone;
    
   ⓖ 임시영역에서 데이터 영역에 레코드를 저장합니다.
   COMMIT WORK;



7. Transaction 테스트
   SELECT * FROM handphone;

   INSERT INTO handphone(num, name, vender) VALUES(4, 'jsp_phone', 'korea');
   SELECT * FROM handphone;
    
   ⓐ 실행 취소 - INSERT문 실행 취소
   ROLLBACK WORK;
   SELECT * FROM handphone;

   ⓑ 데이터 변경이 여러번 있는 경우
   INSERT INTO handphone(num, name, vender) VALUES(4, 'jsp_phone', 'korea');
   SELECT * FROM handphone;
   UPDATE handphone SET name='ejb_phone' WHERE num=1;
   SELECT * FROM handphone;

   ROLLBACK;
   SELECT * FROM handphone;
    
   ⓒ 데이터 영역에 적용 , 복구 불가능
   INSERT INTO handphone(num, name, vender) VALUES(4, 'jsp_phone', 'korea');
   SELECT * FROM handphone;
   UPDATE handphone SET name='ejb_phone' WHERE num=1;
   SELECT * FROM handphone;

   COMMIT;
    
   ⓓ 한번 COMMIT, ROLLBACK된 데이터는 취소 될 수 없습니다.
   ROLLBACK;
   SELECT * FROM handphone;
         
    

         
8. Weblogic Connection Pool Transaction 테스트    

>>>>> domains/ejb/applications/web/pool/tablelist.jsp,
- http://127.0.0.1:7001/ejb2030/pool/tablelist.jsp

<%@ page contentType="text/html;charset=EUC-KR"%>

<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>

<html>
<head>
<title> 사용자가 가지고 있는 모든 테이블 보기 </title>
</head>
<body>
<h2>Connection/DataSource/Transaction Test<h2><br><br>
<h3>
<%
Context ctx = null;     //Interface
DataSource ds = null;   //Interface
Connection con = null;  //Interface
Statement stmt = null;  //Interface
ResultSet rs = null;    //Interface

String sql = "SELECT * FROM tab";

try{
    //JNDI 서비스를 사용하기위해 초기화 작업을 합니다.
    ctx = new InitialContext();  //Interface = new Class
    ds = (javax.sql.DataSource)ctx.lookup("ora10g2");
    con = ds.getConnection();

    //트랜잭션을 개발자가 통제합니다.
    con.setAutoCommit(false);

    stmt = con.createStatement();
    rs = stmt.executeQuery(sql); //SELECT
    out.println("테이블 리스트<br>");
    out.println("----------------------<br>");
   
    //BOF ---> rs.next() ---> 1번째 레코드로 이동
    //이동을 성공적으로 하면 true를 리턴합니다.
    while(rs.next()){
        //rs.getString("tname")
        out.println(rs.getString(1) + "&nbsp;&nbsp;&nbsp;" + rs.getString(2));
        out.println("<br>");
    }

    //트랜잭션을 적용 합니다.
    con.commit();
}catch(Exception e){
    //트랜잭션을 취소합니다.
    con.rollback();
    out.println(e.toString());
}finally{
    con.setAutoCommit(true);
    if(rs != null){try{ rs.close();}catch(SQLException ex){}}
    if(stmt != null){try{ stmt.close();}catch(SQLException ex){}}
    if(con != null){try{ con.close();}catch(SQLException ex){}}
} // END finally

%>
</h3>
</body>
</html>



9. JTA를 이용한 분산 트랜잭션의 이용
   - 2단계 커밋을 지원하는 분산 트랜잭션 지원

   - XA thin드라이버를 이용한 JDBC 프로그래밍(MS-SQL, Oracle 9i)

   - 분산 트랜잭션은 JTA Api 사용을 위해 "javax.transaction.*" 패키지를 임포트합니다.

   - Transaction 관리 객체를 따로 생성합니다. Connection의 범위를 벗어남으로
     Connection에서 트랜잭션을 관리하지 않습니다.

   - 실습용 테이블
     CREATE TABLE book(
         num NUMBER(5) NOT NULL
     )


>>>>> domains/ejb/applications/web/pool/xa_tablelist.jsp,
- http://127.0.0.1:7001/ejb2030/pool/xa_tablelist.jsp

<%@ page contentType="text/html;charset=EUC-KR"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.transaction.*"%>
<html>
<head>
<title> 사용자가 가지고 있는 모든 테이블 보기 </title>
</head>
<body>
<h2>Connection/DataSource/분산 Transaction Test<h2><br><br>
 <h3>
<%
Context ctx = null;
UserTransaction tx = null;

DataSource ds = null;
Connection con = null;
Statement stmt = null;
ResultSet rs = null;

DataSource ds2 = null;
Connection con2 = null;
Statement stmt2 = null;
ResultSet rs2 = null;
 
String sql = "SELECT * FROM tab";

try{
 ctx = new InitialContext();

 //분산 트랜잭션 관리 객체 생성
 tx = (UserTransaction)ctx.lookup("javax.transaction.UserTransaction");

 //분산 트랜잭션 시작
 tx.begin();

    //1번째 데이터베이스의 테이블 리스트  
 ds = (javax.sql.DataSource)ctx.lookup("ora10g2xa");
 con = ds.getConnection();
 stmt = con.createStatement();
 rs = stmt.executeQuery(sql);
 out.println("테이블 리스트<br>");
 out.println("----------------------<br>");

 while(rs.next()){
  out.println(rs.getString(1) + "&nbsp;&nbsp;&nbsp;" + rs.getString(2));
  out.println("<br>");
 }


    out.println("<br><br>");
       
 //2번째 데이터베이스의 테이블 리스트

 ds2 = (javax.sql.DataSource)ctx.lookup("ora10g2xa2");
 con2 = ds2.getConnection();
 stmt2 = con2.createStatement();
 rs2 = stmt2.executeQuery(sql);
 out.println("테이블 리스트<br>");
 out.println("----------------------<br>");

 while(rs2.next()){
  out.println(rs2.getString(1) + "&nbsp;&nbsp;&nbsp;" + rs2.getString(2));
  out.println("<br>");
 }

 //분산 트랜잭션 적용
 tx.commit();
}catch(Exception e){
 //트랜잭션 취소
 tx.rollback();
 out.println(e.toString());
}finally{
 if(rs != null){try{rs.close();}catch(SQLException ex){}}
 if(stmt != null){try{stmt.close();}catch(SQLException ex){}}
 if(con != null){try{con.close();}catch(SQLException ex){}}
 if(rs2 != null){try{rs2.close();}catch(SQLException ex){}}
 if(stmt2 != null){try{stmt2.close();}catch(SQLException ex){}}
 if(con2 != null){try{con2.close();}catch(SQLException ex){}}
} // finally
%>
</h3>
</body>
</html>

by 狂虎 | 2010/09/18 00:07 | 수첩 | 트랙백(1) | 덧글(0)

트랙백 주소 : http://mt1716.egloos.com/tb/10577771
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from at 2014/03/11 00:42

제목 : http://helenmccrory.org/
line5...more

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶