본문 바로가기

프로그래밍/JSP & Servlet

커넥션 풀 (DBCP) oracle

1. server.xml 파일에 JNDI 등록 

server.xml 파일의 GlobalNamingResources노드에 Resource를 등록하고 Host 노드 하위 Context 노드에 ResourceLink노드를 등록하여 많이 사용했다. tomcat 5.5 이전 방식이다.

server.xml

...

<globalnamingresources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <resource auth="Container" driverclassname="oracle.jdbc.OracleDriver" 
maxidle="4" maxtotal="8" name="global.db" password="password" type="javax.sql.DataSource" 
url="jdbc:oracle:thin:@localhost:1521:xe" username="user">
  </resource>
</globalnamingresources>

...


2. context.xml 파일 분리

위 방식처럼 server.xml 파일에 모든 context의 정보를 추가하는 방식은 서버에 대한 제어권이 없으면 정보를 변경하기 힘들다. Tomcat 5.5? 이후부터는 context.xml 파일을 분리하여 webapplication에서 별도로 자원을 등록 사용할 수있도록 제공한다. 

META-INF/context.xml 파일을 위치시키면 Tomcat은 구동시 META-INF 폴더의 context.xml 파일을 찾아 존재할 경우 server.xml 파일의 Host 하위 노드로 추가하여 구동한다.

context.xml 파일의 Context 노드 하위에 resource를 직접 등록하거나 server.xml 파일의 GlobalNamingResources노드에 resource가 등록되어 있다면 ResourceLink를 등록해서 사용하면 된다.

context.xml

<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

   <Resource removeAbandonedOnBorrow="true" removeAbandonedTimeout="10" logAbandoned="true" name="db"
            auth="Container"
            type="javax.sql.DataSource"
            username="user"
            password="password"
            driverClassName="oracle.jdbc.OracleDriver"
            url="jdbc:oracle:thin:@localhost:1521:xe"
            maxTotal="100" maxIdle="30" maxWaitMillis="10000"
            />
    <!-- <ResourceLink global="db" name="db" type="javax.sql.DataSource" /> -->
</Context>


3. web.xml 파일 설정

Tomcat 공식사이트의 document에 따르면 context 추가 후 web.xml 에 resource-ref를 등록하라고 되어있지만 등록하지 않아도 룩업한다.


web.xml

...

<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>db</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

-------------------


커넥션 풀 (DBCP) : tomcat컨테이너가 데이터베이스 인증을 하도록 context.xml파일을 수정

<Resource
auth="Container"
driverClassName = "oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@localhost:1521:orcl"
username = "scott"
password = "1234"
name = "jdbc/Oracle11g"
type = "javax.sql.DataSource"
maxActive = "50"
maxWait = "1000"
/>


 



 

public class MemberDAO{

private DataSource dataSource;


 

public MemberDAO(){

try{

context context = new InitialContext();

dataSource = (DataSource)context.lookup("java:comp/env/jdbc/Oracle11g");

}catch(Exception e){

e.printStackTrace();

}

}


 -------------------------------------------------

또 다른방법 링크이용

 

 

톰캣에서 server.xml

 

 <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->

<!--아래부분 주석-->
    <!--<Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" /> -->
 
 <Resource auth="Container"
 driverClassName = "oracle.jdbc.driver.OracleDriver"
 url = "jdbc:oracle:thin:@localhost:1521:orcl"
 username = "scott"
 password = "1234"
 name = "jdbc/myoracle"
 type = "javax.sql.DataSource"
 maxActive = "20"
 maxIdle = "10"
 maxWait = "-1"
  />
   </GlobalNamingResources>

 

 

 

 

 

context.xml

 

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
 

<!-- 이부분 추가-->
 <ResourceLink global="jdbc/myoracle"
 name="jdbc/myoracle"
 type="javax.sql.DataSource"/>

 

<!--DBCPTEST.jsp-->

<%
/*
DBCP (Database Connection Pool) 사용하기
 : 톰캣 서버가 커넥션 풀에 미리 생성해 놓은 Connection객체를 가져다가 사용하는것을 말함
 즉, 생성과 자원해제를 반복하는것이 아니라 하나의 객체를 만들어놓고 이를 사용하는 것을 말한다.
 
*/
/* Context initCtx = new InitialContext();
Context ctx = (Context)initCtx.lookup("java:comp/env");
DataSource source = (DataSource)ctx.lookup("jdbc/myoracle"); */

Context ctx = new InitialContext();
DataSource source = (DataSource) ctx.lookup("java:comp/env/jdbc/myoracle");

Connection con = source.getConnection();
String conString = "";
if(con!=null) conString = "<h2>DBCP연결 성공</h2>";
else conString = "<h2>DBCP연결 실패</h2>";
if(con!=null) con.close();

out.println(conString);

%>


* initialSize - 연결 풀이 최초 생성될 때 같이 이 숫자만큼 데이터베이스 연결을 미리 생성합니다. 기본값은 0입니다.


* maxActive - 동시에 사용할 수 있는 최대 연결의 갯수 입니다. 음수이면 제한이 없습니다. 기본값은 8 입니다. 이 갯수를 초과하여 요청이 들어오면 최대 maxWait 만큼 대기하고, 그래도 연결을 사용할 수 없을 때는 예외를 발생합니다.


* maxIdle - 풀에서 사용되지 않은 상태로 존재할 수 있는 최대 연결의 숫자 입니다. 음수이면 제한이 없습니다. 기본값은 8 입니다. maxActive가 10 이고, maxIdle이 8일 때 10개의 연결이 모두 사용되고 있는 상태를 가정해 봅니다. 연결이 사용을 마치고 하나씩 반환이 되면, maxIdle 숫자인 8개가 될때까지는 유휴 상태로 풀에 남겨집니다. 아홉번째 부터는 연결이 해제되어 제거 됩니다. 모두 반환된후에 풀에는 유휴상태인 8개의 연결이 남아 있습니다.


* minIdle - 풀에서 사용되지 않은 상태로 존재할 수 있는 최소 연결의 숫자 입니다. 기본 값은 0 입니다. 풀을 관리하는 쓰레드는 풀내의 유휴 연결의 최소 갯수를 이 값으로 유지합니다. 주로 발생하는 상황은 오류가 발생한 연결이나, 사용되지 않고 오래된 연결은 풀에서 제거됩니다. 이 경우 풀내의 연결의 갯수가 minIdle 이하로 떨어지면 새로 생성해서 minIdle 갯수에 맞추게 됩니다.


* maxWait - 풀에 사용 가능할 연결이 없을때 대기하는 최대 시간을 밀리초 단위로 나타냅니다. 이 대기시간후에도 사용 가능한 연결이 없으면 예외를 발생합니다. -1은 무한대기를 나타냅니다. 기본값은 -1입니다.