데이터베이스 관련 알아낸 것들 : JNDI
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를 통해 커넥션 풀에 채워 넣을 커넥션 개수 |
이분꺼 참고하기
GNUJAVA
이 글은 국내에서 많이 사용하고 있는 jdbc의 커넥션 풀링에 대한 보다 다량의 커넥션을 효율적으로 사용할 수 있게 도움을 주는 글을 번역한 것입니다. 원문은 http://www.tomcatexpert.com/blog/2010/04/01/
www.gnujava.com