[JSP] JNDI, Connection Pool 개념 정리
게시판 구현에 앞서 JDBC 개념을 다시 정리함
JDBC = Java DataBase Connectivity
자바에서 데이터베이스에 접속할 수 있도록 하는 API
JNDI = Java Naming and Directory Interface API
연결하고 싶은 DB Pool을 미리 네이밍 시키는 방법중 하나
1) 기본 구성
자바 API → JDBC API → JDBC 드라이버 → 데이터베이스
(JDBC 드라이버는 각 DB의 홈페이지에서 다운받을 수 있다.)
2) 커넥션 풀
사용자가 요청 할 때마다 매번 드라이버를 로드한 뒤 커넥션 객체를 생성,연결,종료 하지 않고
미리 만들어둔 커넥션을 이용 및 관리하는 것
커넥션을 만드는데 드는 시간이 들지않고 계속해서 재사용하기 때문에 생성되는 커넥션 수도 많아지지 않음.
또 생성될 수 있는 수를 제어하기 때문에
사용자가 몰려도 쉽게 다운되지 않고 평소 실행 속도도 빨라진다
context.xml
<Resource
name="jdbc/oracle"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@localhost:1521:XE"
username = ""
password=""
maxActive="50"
maxWait="-1"
/>
- name : 설정 JDBC 이름 (변경가능)
- auth : 컨테이너를 자원 관리자로 기술
- type : 웹에서 리소스를 사용할 때 DataSource로 리턴
- driverClassName : JDBC 드라이버 (Oracle)
- url : jdbc:oracle:thin:@ip주소:포트번호:전역 DB명
- maxActive : 최대 연결 가능한 Connection수
- maxWait : 사용가능 커넥션이 없을 때 회수를 기다리는 시간
public class JDBConnection {
public Connection con;
public Statement stmt;
public PreparedStatement psmt;
public ResultSet rs;
//기본 생성자
public JDBConnection() {
try {
//커넥션 풀 얻기
Context initContext = new InitialContext();
Context ctx = (Context)initContext.lookup("java:comp/env");
DataSource source = (DataSource)ctx.lookup("jdbc/oracle");
con = source.getConnection();
System.out.println("db 연결 성공");
} catch (SQLException | NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("db 커넥션 풀 연결 실패");
}
}
public JDBConnection(String driver, String url, String id, String pwd) {
try {
Class.forName(driver);
con = DriverManager.getConnection(url, id, pwd);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public JDBConnection(ServletContext application) {
try {
//JDBC 드라이버 로드
String driver = application.getInitParameter("OracleDriver");
Class.forName(driver);
//DB 연결
String url = application.getInitParameter("OracleURL");
String id = application.getInitParameter("OracleId");
String pwd = application.getInitParameter("OraclePwd");
con = DriverManager.getConnection(url, id, pwd);
System.out.println("db 연결 성공 - 매개변수 application");
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void close() {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(psmt != null) psmt.close();
if(con != null) con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- Context initContext = new InitialContext();
naming context. 모든 네이밍 조작은 Context 인터페이스의 구현에서 수행 됨. 서버를 사용할 수 있도록 Context를 구성 - Context ctx = (Context)initContext.lookup(“java:comp/env”);
Context의 lookup(참고 메서드)를 이용해 “java:comp/env” 정보를 읽음
web.xml에서 앤트리나 리소스 정보는 “java:comp/env”에 위치 됨 - DataSource source = (DataSource)ctx.lookup(“jdbc/oracle”);
ctx의 lookup(참고 메서드)를 이용해 “jdbc/oracle”에 해당하는 객체를 찾아서 DataSource에 삽입.
jdbc/oracle는 context.xml에 설정해줬던 이름임 - con = source.getConnection();
getConnection 메서드를 이용해 커넥션 풀로부터 커넥션 객체를 얻어 con에 저장 - public JDBConnection(ServletContext application)
application영역에 미리 context-param로 url, id, pw등을 저장해놓고 꺼내와 DriverManager를 이용해 커넥션