[2023_08_09] 해당 발행글은 Oracle을 기준으로 작성되었습니다.

 

 

 

 

Connection Pool은 연결 객체를 생성하고 영구소멸하는 것이 아니라 대여와 반납의 개념으로 이루어집니다.

 

 

 


 

 

Connection Pool은 DataSource Interface의 규격대로 DataSource를 제공합니다.

이러한 DataSource는 Tomcat같은 WAS 내부에서 생성하게 됩니다.

 

WAS가 DataSource를 생성하는 방법은 두 가지가 있습니다.

 

  • Global DataSource
  • 애플리케이션 별 Local DataSource

 

Global DataSource는 표준에 따라 생성 후 제공하지만, 각 벤더의 WAS마다 설정방법이 모두 다르기 때문에

WAS가 바뀌어도 소스를 변경할 필요가 없는 Local DataSource를 사용하는 것을 권장합니다.

 

 

다음 경로에 프로젝트 내에 META-INF 폴더를 만들고 context.xml을 생성합니다.

 

 


 

 

기초적인 context.xml Syntax입니다.

 

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

<Context>

    <!-- <Resource 
        name="jdbc/OracleLocalDB" 
        auth="Container"
        type="javax.sql.DataSource"
        username="이름작성"
        password="비밀번호작성"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@db이름?TNS_ADMIN=db설치주소"
        maxTotal="8"
        maxIdle="2"
    /> -->

    <Resource 
        name="jdbc/OracleCloudATP" 
        auth="Container"
        type="javax.sql.DataSource"
        username="이름작성"
        password="비밀번호작성"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@tns_name?TNS_ADMIN=클라우드지갑주소"
        maxTotal="8"
        maxIdle="2"
    />

<!--     <Resource 
        name="jdbc/OracleLocalDBWithDriverSpy" 
        auth="Container"
        type="javax.sql.DataSource"
        username="이름작성"
        password="비밀번호작성"
        driverClassName="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"
        url="jdbc:log4jdbc:oracle:thin:@db이름?TNS_ADMIN=db설치주소"
        maxTotal="8"
        maxIdle="2"
    /> -->

    <Resource 
        name="jdbc/OracleCloudATPWithDriverSpy" 
        auth="Container"
        type="javax.sql.DataSource"
        username="이름작성"
        password="비밀번호작성"
        driverClassName="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"
        url="jdbc:log4jdbc:oracle:thin:@tns_name?TNS_ADMIN=클라우드지갑주소"
        maxTotal="8"
        maxIdle="2"
    />

</Context>

 

주석된 부분은 LocalDB이므로 필요하신 분은 주석 해제 후 개발환경에 맞게 작성하시면 됩니다.

 

 


 

 

위의 코드를 참고해서 Connection Pool을 두개를 사용하겠습니다.이제 Eclipse에서 Tomcat Server를 실행하고 Servlet을 작성합니다.

 

Servlet을 작성할 때, LifeCycleMethods를 모두 생성합니다.

 

 

다음 코드를 작성합니다.

 

@Log4j2
@NoArgsConstructor

@WebServlet("/UsingDataSource")
public class UsingDataSourceServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    // 의존성 주입
    @Resource(name="jdbc/OracleCloudATP")
    private DataSource dataSource;


    public void init(ServletConfig config) throws ServletException {
        log.trace("init({}) invoked.", config);
		
        Objects.requireNonNull(dataSource);
        log.info("\t + dataSource: " + dataSource);
    } // init()


    public void destroy() {
        log.trace("destroy() invoked.");
    } // destroy()


    protected void service(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
        log.trace("service(req, res) invoked.");
		
        try {
            Connection conn = this.dataSource.getConnection();
			
            try(conn){
                Objects.requireNonNull(conn);
                log.info("\t + conn: {}", conn);
            } // try
			
        } catch (SQLException e) {
            throw new IOException(e);
        } // try-catch
		
    } // service()

} // end class

 

@Resource 어노테이션은 지정된 자원의 레퍼런스를 획득 후 DataSource의 필드에 의존성 주입을 하게 됩니다.

이제 서버에 작성된 Servlet을 올릴 때마다, Connection Pool에 Data Resource를 계속해서 추가하게 됩니다.

 

 

 

'웹 표준 > Servlet' 카테고리의 다른 글

Session Tracking  (0) 2023.09.14
FrontController, Command Patterns  (0) 2023.09.13
Request  (0) 2023.09.13
DTO, DAO, VO  (0) 2023.09.12
톰캣 사양 별 DTD  (0) 2023.09.05

+ Recent posts