내 블로그 목록

2018년 7월 17일 화요일

[JSP] 일간 뷰어 인터뷰_커넥션 풀편

Q. 커넥션 풀의 개념을 아느냐?


아니, 모른다. 지금 배우고 있는 중이다.


커넥션 풀이란, JDBC를 실행할 때 앞부분에서 커넥션(Connection)을 생성/실행하지 않느냐. 하지만 이것이
귀찮았던 사람들은 풀(Pool)에다 커넥션을 미리 만들어 놓는다. 그러면 풀에서 커넥션을 가져와 사용했다가 사용이
끝나면 다시 반환하는 방법을 사용할 수 있기 때문이다. 마치 만화방에서 만화책을 빌렸다가 다시 돌려주는 것과 같다.
이것이 커넥션 풀이다.


커넥션 풀의 장점은 아무래도 귀찮음을 덜 수 있다는 것이고,  또한 메모리도 적게 먹는다.

Q. 커넥션 풀을 설치 방법은 무엇인가?


아파치 홈페이지(http://commons.apache.org/)에 접속 -Project- commons - DBCP/ Pool  - Release -
download - Apache Commons DBCP 2.4.0 for JDBC 4.1 on Java 7 -commons-dbcp2-2.4.0-bin.zip  
/ Apache Commons Pool  2.6.0(Java 7) - commons-pool2-2.6.0-bin.zip 을 찾아 압축을 푼다.


그러면 commons-pool2-2.6.0/ commons-dbcp2-2.4.0 Jar 파일이 있을 것이다.
이를 사용하고 자하는 이클립스 프로젝트 WEB-INF lib에 추가해 준다.


Q. 설치가 끝났다. 커넥션 풀의 사용 방법은 무엇인가.


DBCP가 제공하는 JDBC 드라이버 로딩
– Class.forName("org.apache.commons.dbcp2.PoolingDriver");
   PoolingDriver driver = (PoolingDriver)     
   DriverManager.getDriver("jdbc:apache:commons:dbcp:");
   driver.registerPool(“pootest"*, connectionPool);


DBCP가 제공하는 커넥션 풀로부터 커넥션 가져오기
– JDBC URL: jdbc:apache:commons:dbcp:풀이름*
– DriverManager.getConnection("jdbc:apache:commons:dbcp:pooltest");


*”pootest” 이것은 풀이름 또는 식별자이다. 변경 지정 가능하다.
*이 경우, 풀이름에는 pootest를 써준다.

Q.이해가 잘 되지 않는다. 코드로 구체적으로 보여 달라.


1.
Java Resources에 DBCPInit.java 클래스를 만든다.
package Jdbc;
public class DBCPInit extends HttpServlet {


@Override
public void init()* throws ServletException {
loadJDBCDriver();
initConnectionPool();
}
private void loadJDBCDriver() {
try {
//커넥션 풀이 내부에서 사용할 jdbc 드라이버를 로딩함.
//Class.forName("com.mysql.jdbc.Driver");
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException ex) {
throw new RuntimeException("fail to load JDBC Driver", ex);
}
}
private void initConnectionPool() {
try {
//String jdbcUrl = "jdbc:mysql://localhost:3306/test?" + "useUnicode=true&characterEncoding=utf8";
String jdbcDriver = "jdbc:oracle:thin:localhost:1521:orcl";
String username = “scott";
String pw = “tiger";
//커넥션풀이 새로운 커넥션을 생성할 때 사용할 커넥션팩토리를 생성.
ConnectionFactory connFactory = new DriverManagerConnectionFactory(jdbcUrl, username, pw);
// PoolableConnection을 생성하는 팩토리 생성.
// DBCP는 커넥션을 보관할 때 PoolableConnection 을 사용
// 실제 커넥션을 담고 있있으며, 커넥션 풀을 관리하는데 필요한 기능을 제공한다.
// 커넥션을 close하면 종료하지 않고 커넥션 풀에 반환
PoolableConnectionFactory poolableConnFactory = new PoolableConnectionFactory(connFactory, null);
//커넥션이 유효한지 여부를 검사할 때 사용하는 쿼리를 지정한다.
poolableConnFactory.setValidationQuery("select 1");
//커넥션 풀의 설정 정보를 생성한다.
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
//유휴 커넥션 검사 주기
poolConfig.setTimeBetweenEvictionRunsMillis(1000L * 60L * 5L);
//풀에 보관중인 커넥션이 유효한지 검사할지 유무 설정(자동)
poolConfig.setTestWhileIdle(true);
//커넥션 최소 개수
poolConfig.setMinIdle(4);
//커넥션 최대 개수
poolConfig.setMaxTotal(50);
//커넥션 풀을 생성. 생성자는 PoolabeConnectionFactory와 GenericObjectPoolConfig를 사용
GenericObjectPool<PoolableConnection> connectionPool =
new GenericObjectPool<>(poolableConnFactory, poolConfig);
//PoolabeConnectionFactory에도 커넥션 풀을 연결
poolableConnFactory.setPool(connectionPool);
//커넥션 풀을 제공하는 jdbc 드라이버를 등록.
Class.forName("org.apache.commons.dbcp2.PoolingDriver");
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
//위에서 커넥션 풀 드라이버에 생성한 커넥션 풀을 등록한다. 이름은 chap14 이다.
driver.registerPool(“pooltest"*, connectionPool);
} catch (Exception e) {
throw new RuntimeException(e);
}
  }
}


*다른 것은 카피해서 사용해도 된다. 그러나 커넥션을 얻어올 풀이름(식별자)만큼은 주의해서
설정해야 한다.

2.
web.xml 파일에서 <web-app> 안에 다음 문단을 추가해 준다.


<servlet>
<servlet-name>DBCPInit</servlet-name>
<servlet-class>Table.DBCPInit</servlet-class>*
<load-on-startup>1</load-on-startup>
</servlet>


*이는 Java Resource의 ‘패키지이름.클래스이름’이다.

3.
커넥션을 추가하고 자 하는 파일(ex) emp_select.jsp)에 다음을 추가해준다. 실행한다. 끝.


String jdbcDriver = "jdbc:apache:commons:dbcp:pooltest*";
conn = DriverManager.getConnection(jdbcDriver);


*pooltest는 앞서 1번에서 지정해줬던 풀이름이다.

Q. 예시 코드에서  loadJDBCDriver()와 initConnectionPool()메서드를 실행시키는 Init()메서드를
만들어 보았다. Init() 메서드는 언제 사용하는가?


Init() 메서드의 사용 경우 크게 두 가지로 나눠 진다.
  1. 사용자의 요청을 처리하기 위해서
  2. 초기화를 하기 위해서


(1) 번의 경우 Init()메서드는 컨트롤러 역할을 하며, (2)번은 주로 Tomcat을 실행할 때 이루어진다.

댓글 없음:

댓글 쓰기