ETC/Tip & 설정 변경

데이터베이스 관련 알아낸 것들 : JNDI

구일일구 2022. 10. 12. 19:17
반응형

JNDI

* Java Naming and Directory Interface

* 디렉토리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API

* 용도1 : 자바 application을 외부 디렉토리 서비스에 연결 (예, 주소 데이터베이스 or LDAP 서버)

* 용도2: 자바 application이 호스팅 웹 컨테이너가 제공하는 구성 정보를 참고함

: 우리가 연결하고 싶은 데이터베이스의 DB pool을 미리 Naming 시켜주는 방법 중 하나이다. 우리가 저장해 놓은 WAS의 데이터베이스 정보에 JNDI를 설정해 놓으면 웹 어플리케이션은 JNDI만 호출하면 간단해짐

: 운영, 관리, 최적화 문제 대처에 다양한 이점이 있기 때문에 JNDI를 사용함

 

 

 

<META-INF/context.xml>

<?xml version="1.0" encoding="UTF-8"?>
<Context> 
     <Resource name="jdbc/OracleDB" //자원의 이름
         auth="Container"     //자원관리주체
         type="javax.sql.DataSource"  //톰캣서버에서 리턴하는 자원의 클래스이름
         username="shop"  //DB단에서 사용하는 아이디
         password="shop" //DB단에서 사용하는 비밀번호
         driverClassName="oracle.jdbc.driver.OracleDriver" 
//oracle.jdbc 패키지 안에 있는 OracleDriver를 사용(java.sql.driver라는 인터페이스를 구현)
//DB와 연결할 수 있게 해줌
         factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
         url="jdbc:oracle:thin:@localhost:1521:XE" //본인의 오라클 주소에 해당하는 내용 적기
         maxActive="500" 
         maxIdle="100"/>  
 </Context>

* Server.xml에 설정하면 모든 application이 바라볼 수 있다.

* META-INF/context.xml이나 conf/engineName/host/context.xml 같은 곳에 설정하면, 해당되는 application만 바라볼 수 있다.

* factory 부분을 보면, "org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"이다.

jdbc의 커넥션풀에 대해 다량의 커넥션을 효율적으로 사용할 수 있게 도움을 주는 것인데, commons-dbcp패키지에서 위에서 말한 factory로 교체해야 한다는 것이다. 

이뉴는 대략 commons-dbcp패키지는 thread 세이프로 작성되어 운영하는 서버가 멀티코어/멀티 thread 일때, 성능이 느려짐

하나의 싱글톤 인스턴스로 커넥션을 관리하기 때문에 커넥션 풀을 운영하는 서버에 CPU가 많고 커넥션 풀의 개수도 많을 경우 성능 하락이 발생된다는 것이다 : 이를 해결하기 위해 톰캣에서 DBCP의 풀 팩토리를 사용하는 것이다.

 

* 톰캣이 type="javax.sql.DataSource"를 설정에서 읽게되면, factory부분에서 자동으로 DBCP 패키지로 재포장시킨다. 팩토리 오브젝트가 커넥션풀을 생성시키고 설정을 하게 되는 것이다. 

* maxActive의 값은 500이다 : 데이터베이스로의 연결이 가능한 최대 개수. 이 개수는 데이터베이스의 성능에 맞춰서 최대 열 커넥션의 개수를 지정해주면 된다.

* maxIdle의 값은 100이다 : 커넥션 풀에 항상 연결상태를 유지하는 개수를 의미한다.

* 일단 커넥션 풀에 연결 요청이 추가되어 사용된 뒤, maxAge 속성에서 정의된 시간동안 사용이 되지 않을 경우 여기서 설정해준 갯수보다 넘처나는 연결들은 끊어버리게 된다. 따라서 커넥션 풀에서는 항상 이 숫자보다 적은 연결 객수를 가질 수 없게 된다. 

maxActive 동시에 사용할 수 있는 최대 커넥션 개수
maxIdle Connection Pool에 반납할 때 최대로 유지될 수 있는 커넥션 개수
minIdle 최소한으로 유지할 커넥션 개수
initialSize 최초로 getConnection() Method를 통해 커넥션 풀에 채워 넣을 커넥션 개수

이분꺼 참고하기

http://www.gnujava.com/board/article_view.jsp?article_no=1420&menu_cd=19&board_no=6&table_cd=EPAR02&table_no=02 

 

GNUJAVA

이 글은 국내에서 많이 사용하고 있는 jdbc의 커넥션 풀링에 대한 보다 다량의 커넥션을 효율적으로 사용할 수 있게 도움을 주는 글을 번역한 것입니다. 원문은 http://www.tomcatexpert.com/blog/2010/04/01/

www.gnujava.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형