본문 바로가기
WEB&WAS/Apache Tomcat

WAS) Tomcat에서 JNDI 사용하여 DBCP 설정하기

by LILO 2023. 7. 14.
반응형

INTRO

Tomcat(WAS)를 사용하다 보면 DB를 연동해야될 경우가 많을 것입니다.

소스에 DBCP, Hikari CP 등 DB Connection Pool을 설정하여 사용하는 경우도 많지만 이 글에서는 Apache Tomcat에서 DB Connection Pool 설정하는 방법에 대해 이야기 하려고 합니다.

 

 

DBCP (DB Connection Pool)

DBCP는 지정한 수만큼 미리 DB Connection을 만들어 놓고 사용자가 요청하면 DB Connection Pool에서 꺼내서 사용하고 반환할 수 있게 해주는 Connection Pool 라이브러리입니다.

 

DBCP를 사용하면 사용자가 요청할 때마다 Connection을 생성하여 10000명이 요청하면 10000개를 생성하여 시스템에 부하를 주는 것을 방지할 수 있습니다.

 

https://d2.naver.com/helloworld/5102792

 

 

JNDI (Java Naming and Directory Interface)

JNDI란 연결하고 싶은 DB 커넥션 객체를 Naming 시켜주는 방법으로 WAS에서 많이 설정하는 방법입니다.

하나의 WAS에서 여러 Application을 올려서 사용하는 경우 여러 개의 JNDI 설정을 통해 DB와 연결이 가능합니다.

 

https://docs.oracle.com/javase/jndi/tutorial/getStarted/overview/index.html

 

 

Tomcat에서 JNDI 사용하여 DBCP 설정하기

 

server.xml 설정 파일에서 GlobalNamingResources에 JNDI를 설정합니다.

이는 사용하는 DB 별로 설정이 조금씩 다르다는 점 참고바랍니다.

 

아래는 Oracle DB와 연동하는 설정입니다.

아래의 설정은 예시이므로 운영 서버에 적용하기 전에 스테이징 서버 등 비운영 서버에서 부하테스트를 통해 적절한 값을 찾을 필요가 있습니다. 

 

DB 커넥션을 맺은 시간이 오래되고 사용이 없을 경우 DB의 커넥션이 끊길 경우가 있는데 이를 방지하기 위해 WAS에서 Validation Query를 질의하는 설정을 추가하였습니다.

$ vi  /tomcat/instance1/conf/server.xml

<GlobalNamingResources>
   <!-- OracleDB DataSource Setting -->
   <Resource name="jndi/orcl"
      auth="Container"
      type="javax.sql.DataSource"
      driverClassName="oracle.jdbc.driver.OracleDriver"
      minIdle="5"
      maxActive="10"
      maxIdle="10"
      maxWait="5000"
      validationQuery="select 1 from dual"
      url="jdbc:oracle:thin:@<OracleDB IP>:<리스너 포트>:<OracleDB SID>"
      username="oracle"
      password="oracle"/>

</GlobalNamingResources>
      
      
$ vi /tomcat9/instance1/conf/context.xml

<!-- The contents of this file will be loaded for each web application -->
<Context>
<ResourceLink global="jndi/orcl" name="jndi/orcl" type="javax.sql.DataSource"/>
</Context>

 

아래는 MySQL과 연동하는 설정입니다. (MariaDB도 비슷합니다.)

$ vi  /tomcat/instance1/conf/server.xml

<GlobalNamingResources>
   <!-- MySQL DataSource Setting -->
   <Resource name="jndi/mysql"
      auth="Container"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      minIdle="5"
      maxActive="10"
      maxIdle="10"
      maxWait="5000"
      validationQuery="select 1 from dual"
      url="jdbc:mysql://<MySQL DB IP>:<DB 포트>/<DB명>?characterEncoding=utf8&useSSL=false"
      username="mysql"
      password="mysql"/>

</GlobalNamingResources>
      
      
$ vi /tomcat9/instance1/conf/context.xml

<!-- The contents of this file will be loaded for each web application -->
<Context>
<ResourceLink global="jndi/mysql" name="jndi/mysql" type="javax.sql.DataSource"/>
</Context>

 

연동시 SSL 인증서 검증과 관련된 에러가 나온다면 url 파라미터에 "useSSL=false"를 넣어서 에러를 피하는 방법도 있습니다.

For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
반응형