September 05, 2021
[이미지 출처] https://devbox.tistory.com/entry/JSP-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80-1
javax.sql.DataSource
name
)을 찾아서(lookup
) 활용하면 된다.Initialcontext
는 JNDI namespace의 모든 명명된 객체를 찾을 때 사용하는 객체context.xml
파일에 커넥션풀을 만드는 DataSource 리소스를 등록한다.JDBC Driver 설정
ojdbc6.jar
파일을 WebContent\WEP-INF\lib
폴더에 넣는다커넥션풀에 대한 정보를 DataSource에 설정
Servers\Tomcat v9.0 Server at localhost-config\context.xml
파일에 설정해도 되고,Servers\Tomcat v9.0 Server at localhost-config\context.xml
을 복사해서 현 프로젝트의 META-INF
하단에 붙여넣기 후 편집해도 된다. 프로젝트마다 설정하는 것이 더 안정적이므로 두번째 방법으로 하겠다.
<META-INF \ context.xml>
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/myoracle"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
username="SCOTT" password="TIGER"
maxTotal="20"
maxIdle="10"
maxWaitMillis="-1"/>
</Context>
위와 같이 이렇게 이름이 “jdbc/myoracle”이고, 종류는 DataSource인 resource를 생성하였다.
✅ Resource 설정값 설명
커넥션풀 설정값 | 설명 |
---|---|
initialSize | 최초로 커넥션풀 생성 시 만들 Connection 객체의 수 (기본값 0) |
minIdle | 최소한으로 유지될 Connection 객체의 수 (기본값 0) |
maxIdle | 커넥션풀에 반납된 유휴 Connection 객체를 유지할 수 있는 최대값 (기본값 8) |
maxTotal (= maxActive) | 동시에 사용할 수 있는 최대 커넥션 갯수 (기본값 8) |
maxWaitMillis (=maxWait) | 할당받을 Connection 객체가 없을 때 스레드를 블록시킬 시간 (1/1000초 단위) / -1 : 무한 대기 의미 |
.java 혹은 .jsp 파일에서 사용
<DButil.java>
package util;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
public class DBUtil {
// datasource는 static 멤버변수로 설정 - 하나의 객체만 생성
private static DataSource ds;
static {
try {
// InitialContext가 생성되면서 context.xml에 저장된 정보를 읽어온다
Context initContext = new InitialContext();
// "java:/comp/env" = java environment상의 component(=재사용 가능한 객체)
// 자바 실행환경 내부에 저장된 자원을 검색해서 사용하겠다는 뜻
Context envContext = (Context)initContext.lookup("java:/comp/env");
// "jdbc/myoracle" 이름으로 되어있는 자원(즉 Datasource)을 ds라는 변수명으로 사용
ds = (DataSource)envContext.lookup("jdbc/myoracle");
} catch (NamingException e) {
e.printStackTrace();
}
}
// getConnection() 메소드 실행시마다 커넥션풀로부터 커넥션 받아오는 메소드
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
프로젝트를 Maven 프로젝트로 변환
pom.xml
설정파일 수정하여 oracle Driver 등록 및 javax.persistence, org.hibernate 등록 persistence.xml
설정파일 수정 (1~3번 과정 이전 포스팅 참고 - [Java] 12. JPA ).java 혹은 .jsp 파일에서 사용
<DBUtil.java>
package util;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class DBUtil {
private static EntityManagerFactory emf;
static {
emf = Persistence.createEntityManagerFactory("myoracle");
// EntityManagerFactory는 웹어플리케이션이 로딩되는 시점에 딱 한개만 생성
// 사용자 요청시마다(=스레드 하나 생성될때마다) EntityManager를 생성, 관리
// JDBC의 Connection Pool과 같다고 생각하면 됨
}
public static EntityManager getEntityManager() throws SQLException {
return emf.createEntityManager();
// EntityManager는 스레드 간에 공유되지 않음
// 엔티티와 관련된 모든 일(CRUD) 처리
// JDBC의 Connection 객체와 같다고 생각하면 됨
}
public static void close() {
emf.close();
emf = null;
}
}