커넥션 풀
웹 애플리케이션이 실행됨과 동시에 연동할 데이터베이스와 미리 연결 해둔다. 필요할 때마다 미리 연결해놓은 상태를 이용해 빠르게 데이터베이스 관련 작업을 할 수 있다. 요약하자면 미리 데이터베이스와 연결 시킨 상태를 유지하는 기술을 커넥션 풀이라 부른다.
JDBC의 문제점은 오래 걸린다는 것이다.
Connection Pool객체를 이용하면 미리 연결된 상태를 유지하므로 빠르게 작업할 수 있다.
커넥션 풀 동작과정
-
톰캣 컨테이너 실행
-
Connection pool 객체 생성
-
커넥션 객체 <-> DBMS 연결
-
데이터베이스와 연동 작업 시, ConnectionPool이 제공하는 메서드를 호출
톰캣은 자체적으로 ConnectionPool을 제공한다.
JNDI
Java Naming and Directory Interface
필요한 자원을 key-value로 저장해서 필요할 때 key를 이용해 value를 얻는 방법.
즉 미리 접근할 자원에 키를 지정한 다음, 앱이 실행 중일 때 해당 키를 이용해 자원에 접근해서 작업하는 것이다.
실제로 ConnectionPool객체를 구현할 때 javaSE가 제공하는 javax.sql.DataSource클래스를 이용한다. 그리고 톰캣이 만들어놓은 ConnectionPool객체에 접근할 때는 JNDI를 이용한다.
JNDI 사용 예
- 웹 브라우저 name / value 쌍으로 전송한 후 서블릿에서 getParameter()로 값을 가져올 때
- HashMap에 key/value로 저장한 후 키를 이용해 값을 가져올 때
톰캣 DataSource 설정 및 사용
1.dbpc.jar파일 설치
이전 글 에서 약간 코드를 수정했다.
package pro07.sec01.ex01;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class MemberDAO {
/* JDBC 설정
* private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //DRIVER
* NAME private static final String URL =
* "jdbc:mysql://127.0.0.1:3306/servletex?serverTimezone=Asia/Seoul"; //JDBC
* URL/스키마 private static final String USER = "servlet"; //DB ID private static
* final String PWD = "1234"; //DB PW
*/
private Connection con;
private PreparedStatement pstmt;
//DataSource설정
private DataSource ds;
public MemberDAO() {
try {
//JNDI에 접근하기 위해 기본 경로를 지정
Context ctx = new InitialContext();
Context envContext = (Context) ctx.lookup("java:/comp/env");
//context.xml에 설정한 name값을 이용해 톰캣이 미리 연결한 DataSource를 받아온다.
ds = (DataSource) envContext.lookup("jdbc/mysql");
} catch (Exception e) {
e.printStackTrace();
}
} //생성자
List<MemberVO> listMembers() {
List<MemberVO> list = new ArrayList<>();
try {
// connectDB(); //JDBC설정
//DataSource를 이용해 데이터베이스에 연결한다.
con = ds.getConnection();
String sql = "select * from t_member";
System.out.println("Query : " + sql);
pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
/*
* select문을 날려서 받아올 칼럼들.
* getString(String columnLabel)으로 받아온다.
* */
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String email = rs.getString("email");
Date regdate = rs.getDate("regdate");
/*
* 받아온 데이터를
* MemberVO객체에 담는다.
* */
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setRegdate(regdate);
list.add(vo);
}
//연결했던 반대순서로 닫는다.
rs.close();
pstmt.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
return list;
} //listMembers()
/* JDBC설정
* private void connectDB() { try { Class.forName("com.mysql.cj.jdbc.Driver");
* System.out.println("DRIVER LOADING....."); con =
* DriverManager.getConnection(URL, USER, PWD);
* System.out.println("Connection 생성");
*
* } catch (Exception e) { e.printStackTrace(); } }
*/
}
결과는 같다. 다만 이번엔 커넥션풀을 이용해 DB와 연동했다는 점이 다르다.
'Servlet-JSP' 카테고리의 다른 글
ServletContext & ServletConfig (0) | 2020.09.10 |
---|---|
바인딩 (0) | 2020.09.10 |
포워드 (0) | 2020.09.10 |
JDBC (0) | 2020.09.10 |
GET & POST (0) | 2020.09.10 |