DataSource
DataSource
- DriverManager와 유사한 기능 수행.
- 웹 어플리케이션에 독립적.
- Connection과 Statement 객체 풀링.
- 분산 트랜잭션 수행 가능.
- 자체적으로 커넥션 풀 기능 구현.
DataSource 적용
DataSource 구현체 준비
- http://commons.apache.org > Components > DBCP > Downloads > latest Release >
commons-dbcp-1.4-bin.zip
- http://commons.apache.org > Components > Pool > Downloads >
commons-pool-1.6-bin.zip
위 두 파일을 다운로드 받아 압축을 해제한 후, 압축이 해제된 jar 파일을프로젝트폴더/WebContent/WEB-INF/lib
폴더에 복사.
DataSource 사용
- BasicDataSource 인스턴스 변수 선언.
BasicDataSource ds;
- BasicDataSource 객체 생성.
ds = new BasicDataSource();
// sc : ServletContext
ds.setDriverClassName(sc.getInitParameter("driver"));
ds.setUrl(sc.getInitParameter("url"));
ds.setUsername(sc.getInitParameter("username"));
ds.setPassword(sc.getInitParameter("password"));
- DAO 객체에 DataSource 주입.
DAO-class-name.setDataSource(ds);
- Connection close
try { if (ds != null) ds.close(); } catch (SQLException e) {}
DataSource 사용
- DataSource 인스턴스 선언
Datasource ds;
- DataSource Setter
public void setDataSource(DataSource ds) {
this.ds = ds;
}
- connection 객체를 가져옴.
connection = ds.getConnection();
- connection 객체 반납.
try {if (connection != null) connection.close(); } catch(Exception e) {}
여기서 커넥션을 close()하면 실제로 커넥션을 해제하는 게 아니라, Proxy Object가 커넥션 객체를 커넥션 풀로 반납.
Server에서 제공하는 DataSource 사용
- tomcat 실행환경 폴더에서 context.xml 파일 수정.
파일 경로 : Servers > Tomcat v7.0 Server at localhost-config > context.xml -
tag 안에 태그 추가.
<Resource name="jdbc/db-name" auth="Container" type="javax.sql.DataSource"
maxActive="10" maxIdle="3" maxWait="10000"
username="username"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/db-name"
closeMethod="close"/>
name : JNDI 이름
auth : 자원 관리의 주체. Application / Container
type : 자원의 타입 지정. fully-qualified java class name 필요.
driverClassName : JDBC 드라이버 클래스의 이름.
url : db connection url
username : db user name
password : db user password
maxActive : DataSource로부터 꺼낼 수 있는 커넥션의 최대 개수. (Default : 8)
maxIdle : DataSource로부터 유지할 수 있는 사용되지 않는 커넥션의 최대 개수. (Default : 8) 이를 초과한 반납되는 커넥션은 닫음.
maxWait : 모든 커넥션이 다 사용되고 있을 때, 커넥션이 반납되어 제공하기까지 기다리는 최대 밀리초. 이 시간이 지날 때 까지 반납되는 커넥션이 없으면 예외 발생.
closeMethod : 톰캣 서버가 종료될 때 자원을 해제하기 위해 호출하는 메소드 이름. 매개변수가 없어야 함.
- DD file에 내용 추가.
<resource-ref>
<res-ref-name>JNDI 이름</res-ref-name>
<res-type>리턴될 자원의 클래스 이름(패키지명 포함)</res-type>
<res-auth>자원 관리의 주체</res-auth>
</resource-ref>
JNDI : Java Naming and Directory Interface API. Directory Service 에 접근하는 데 필요.
- contextInitialized() 에서 DataSource 가져오기.
InitialContext initialContext = new InitialContext();
DataSource ds = (DataSource) initialContext.lookup("java:comp/env/jdbc/studydb");
톰캣 서버에서 자원을 찾기 위해 InitialContext 객체 생성하고, lookup() 통해 JNDI 이름으로 등록되어 있는 서버 자원을 가져옴.