記錄

Servlet) 커넥션 풀(DBCP) 본문

Web/Servlet

Servlet) 커넥션 풀(DBCP)

surhommejk 2018. 3. 29. 15:33

참고 : http://devbox.tistory.com/entry/JSP-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80-1



연결 풀


커넥션 풀(connection pool)은 소프트웨어 공학에서 데이터베이스로의 추가 요청이 필요할 때 연결을 재사용할 수 있도록 관리되는 데이터베이스 연결의 캐시이다. 연결 풀을 사용하면 데이터베이스의 명령 실행의 성능을 강화할 수 있다. 각 사용자마다 데이터베이스 연결을 열고 유지보수하는 것은 비용이 많이 들고 자원을 낭비한다. 연결 풀의 경우 연결이 수립된 이후에 풀에 위치해 있으므로 다시 사용하면 새로운 연결을 수립할 필요가 없어진다. 모든 연결이 사용 중이면 새로운 연결을 만들고 풀에 추가(이건 확인 필요, 어떤 설명의 경우에는 대기한다고 나온다)된다. 연결 풀은 사용자가 데이터베이스에 연결을 수립하는데까지 대기해야하는 시간을 줄이기도 한다.


출처 : 위키






미리 커넥션 객체를 만들어 놓고 이를 필요할 때마다 빌려주고 반환 받음으로써

자원의 효율성을 확보하는 것이 커넥션 풀의 핵심이다









Context.xml (예시1)

    <Resource maxWait="-1"
     maxIdle="20"
     maxActive="50"
     password="1004"
             username="bituser"
             url="jdbc:oracle:thin:@localhost:1521:XE"
             driverClassName="oracle.jdbc.OracleDriver"
             type="javax.sql.DataSource"
             auth="Container"
             name="jdbc/oracle"
/>





Context.xml (예시2)

<Context>

    <!-- Resource를 등록하여 웹에서 JNDI로 호출할 이름과 정보를 설정한다. -->

  <Resource name="jdbc/myconn" auth="Container" type="javax.sql.DataSource"

      factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"

      driverClassName="org.gjt.mm.mysql.Driver"

      url="jdbc:mysql://localhost:3306/web_java?autoReconnect=true"

      username="root" password="12345678"

      maxActive="100" maxIdle="30" maxWait="10000"

      removeAbandoned="true" removeAbandonedTimeout="60"/>

  <!--

        1. name : JNDI로 호출될 이름을 설정한다. (접근 -> java:comp/env/jdbc/myconn)

      2. auth : DBCP를 관리할 관리자 (Container or Application)

      3. type : 해당 resource의 return type

       (DataSource는 Connection 객체를 반환할 수 있다.)

      4. factory : dbcp를 유용하는 관리 클래스 (Tomcat 5.x에 기본으로 존재하는 클래스)

       (직접 DBCP 클래스를 지정해도 동작하는데 문제가 없다.)

       (그러나, Factory 클래스를 이용하면 좀더 안정적으로 관리할 수 있다.)

      5. driverClassName : JDBC를 이용하기 위한 드라이버 클래스

      6. url : DB의 접속 URL (속성으로 자동 재 접속을 선택했다.)

      7. username : DB의 계정 명

      8. password : 계정에 대한 비밀번호

      9. maxActive : 최대 접속 허용 개수

      10. maxIdle : DB Pool에 여분으로 남겨질 최대 Connection 개수

      11. maxWait : DB 연결이 반환되는 Timeout의 최대 시간 (-1은 무한 대기)

      12. removeAbandoned : Connection이 잘못 관리되어 버려진 연결을
찾아 재활용할 것인지의 여부 설정
       (true 설정일 때 현재 DB 연결이 적으면 버려진 연결을 찾아 재활용)

      13. removeAbandonedTimeout : 버려진 연결로 인식할 기본 시간 설정
       (초 단위로 해당 시간이 지나면 버려진 연결로 인식한다.)
  -->    
</Context>





  속성

 설명

 maxActive 

 커넥션 풀이 제공할 최대 커넥션 갯수 

 whenExhaustedAction

 커넥션 풀에서 가져올 수 있는 커넥션이 없을 때 어떻게 동작할지를 지정.

0일 경우 에러 발생

1일 경우 maxWait 속성에서 지정한 시간만큼 커넥션을 구할때까지 기다림.

2일 경우 일시적으로 커넥션을 생성해서 사용

 maxWait

whenExhaustedAction 속성의 값이 1일 때 사용되는 대기 시간.

단위는 1/1000초, 0보다 작을 경우 무한히 대기

 maxIdle 

 사용되지 않고 풀에 저장될 수 있는 최대 커넥션 갯수.

음수일 경우 제한이 없음

 minIdle

사용되지 않고 풀에 저장될 수 있는 최소 커넥션 갯수. 

 testOnBorrow 

 true일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사 

 testOnReturn 

 true일 경우 커넥션 풀에 커넥션을 반환할 때 커넥션이 유효한지의 여부를 검사 

 timeBetweenEvctionRunsMillis 

사용되지 않는 커넥션을 추출하는 쓰레드의 실행 주기 지정.

양수가 아닐 경우 실행되지 않는다.

시간 단위는 1/1000초. 

 numTestsPerEvictionRun 

사용되지 않는 커넥션을 몇 개 검사할 지 지정 

 minEvictableIdleTimeMillis 

사용되지 않는 커넥션을 추출할 때 이 속석에서 지정한 시간 이상 비활성화 상태인 커넥션만 추출.

양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거되지 않음.

시간 단위는 1/1000초 

 testWhileIdle

 true일 경우 비활성화 커넥션을 추출할 때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거.


출처 : http://devbox.tistory.com/entry/JSP-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80-1




src( ~.java) - 예제 1

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
    
     //이름 기반으로 (WAS 안에서)
     Context context = new InitialContext();

     //ClassforName.() 처럼 '이름'으로 object retrieve 해주는 함수 lookup()
     DataSource dbcp = (DataSource)context.lookup("java:comp/env/jdbc/oracle");
    
        //POOL 안에서 연결 객체를 하나 얻어내는 코드
     conn = dbcp.getConnection();




src( ~.java) - 예제 2

Context context = new InitialContext();

// lookup(): 등록된 naming 서비스로부터 자원을 찾고자할 때 사용하는 메서드
// context 객체를 통해 이름으로 Resource를 획득한다.
//("jdbc/myconn"): JNDI 서비스에 접근하기 위한 기본 이름
//(이 자원을 찾겠다.--> web.xml의 <res-ref-name>
DataSource source = (DataSource)context.lookup("java:comp/env/jdbc/myconn");

//source로 부터 Connection 객체를 획득한다.
//이 객체는 이제 Container의 DBCP에 의해 관리된다.
conn = source.getConnection();






Interface Context

This interface represents a naming context, which consists of a set of name-to-object bindings. It contains methods for examining and updating these bindings.



Class InitialContext


public class InitialContext


extends Object

implements Context


This class is the starting context for performing naming operations.

All naming operations are relative to a context. The initial context implements the Context interface and provides the starting point for resolution of names.


When the initial context is constructed, its environment is initialized with properties defined in the environment parameter passed to the constructor, and in any application resource files. In addition, a small number of standard JNDI properties may be specified as system properties or as applet parameters (through the use of Context.APPLET). These special properties are listed in the field detail sections of the Context and LdapContext interface documentation.


JNDI determines each property's value by merging the values from the following two sources, in order:


The first occurrence of the property from the constructor's environment parameter and (for appropriate properties) the applet parameters and system properties.

The application resource files (jndi.properties).

For each property found in both of these two sources, or in more than one application resource file, the property's value is determined as follows. If the property is one of the standard JNDI properties that specify a list of JNDI factories (see Context), all of the values are concatenated into a single colon-separated list. For other properties, only the first value found is used.

The initial context implementation is determined at runtime. The default policy uses the environment property "java.naming.factory.initial", which contains the class name of the initial context factory. An exception to this policy is made when resolving URL strings, as described below.



Interface DataSource

public interface DataSource


extends CommonDataSource, Wrapper

A factory for connections to the physical data source that this DataSource object represents. An alternative to the DriverManager facility, a DataSource object is the preferred means of getting a connection. An object that implements the DataSource interface will typically be registered with a naming service based on the JavaTM Naming and Directory (JNDI) API.


The DataSource interface is implemented by a driver vendor. There are three types of implementations:


Basic implementation -- produces a standard Connection object

Connection pooling implementation -- produces a Connection object that will automatically participate in connection pooling. This implementation works with a middle-tier connection pooling manager.

Distributed transaction implementation -- produces a Connection object that may be used for distributed transactions and almost always participates in connection pooling. This implementation works with a middle-tier transaction manager and almost always with a connection pooling manager.

A DataSource object has properties that can be modified when necessary. For example, if the data source is moved to a different server, the property for the server can be changed. The benefit is that because the data source's properties can be changed, any code accessing that data source does not need to be changed.


A driver that is accessed via a DataSource object does not register itself with the DriverManager. Rather, a DataSource object is retrieved though a lookup operation and then used to create a Connection object. With a basic implementation, the connection obtained through a DataSource object is identical to a connection obtained through the DriverManager facility.



Object lookup(String name)

              throws NamingException


Retrieves the named object. See lookup(Name) for details.

Parameters:

name - the name of the object to look up

Returns:

the object bound to name

Throws:

NamingException - if a naming exception is encountered


Method Detail

getConnection

Connection getConnection()

                         throws SQLException

Attempts to establish a connection with the data source that this DataSource object represents.


Returns:

a connection to the data source

Throws:

SQLException - if a database access error occurs


'Web > Servlet' 카테고리의 다른 글

Servlet) Filter  (0) 2018.04.04
Servlet) "?cmd=~" vs @WebServlet("*.do")  (0) 2018.04.03
Servlet) 예제(단순 알림 or 객체 전달)  (0) 2018.03.29
Servlet) out.print()에 대한 이해  (0) 2018.03.29
Servlet) Life Cycle, @WebServlet 설정  (0) 2018.03.29
Comments