connectionPool(1)전통적인 방법

이진아·2020년 5월 27일
0

1. 준비

1) 사이트

: http://commons.apache.org/

2) jar 파일 다운 및 배포


2. ConnectionPool 사용을 위한 DBCPInit 서블릿

1) DBCPInit.java

public class DBCPInit extends HttpServlet {
	
	Logger logger = Logger.getLogger(DBCPInit.class);
	
	@Override
	public void init() throws ServletException {
		logger.info("[DBCPInit] init() 메서드 호출");
		loadJDBCDriver();//driver 로딩
		initConnectionPool();//connectionPool 생성
	}
	
	/**********************************************************************************************
	 * driver 로딩
	 * 어디 회사 제품인지 인증하는 것과 같다...
	 */
	private void loadJDBCDriver() {
		//xml에 미리 선언해 좋은 서블릿 초기화 파라미터...
		String driver = getServletConfig().getInitParameter("jdbcDriver");
		try {
			//[1] connection pool 내부에서 사용할 jdbc 드라이버 로딩
			Class.forName(driver);
		} catch (ClassNotFoundException ex) {
			//throw new RuntimeException("fail to load JDBC Driver", ex);
			logger.error(ex);
		}
	}
	
	/**********************************************************************************************
	 * connection pool 생성
	 */
	private void initConnectionPool() {
		try {
			String url = getServletConfig().getInitParameter("jdbcUrl");
			String username = getServletConfig().getInitParameter("userName");
			String pw = getServletConfig().getInitParameter("pw");
			
			//[2] ConnectionFactory: pool이 connection을 생성할 떄 사용하는 아이
			ConnectionFactory connFactory = new DriverManagerConnectionFactory(url, username, pw);
			
			//[3] PoolableConnectionFactory: PoolableConnection을 생성하는 팩토리
							//└> DBCP가 pool에 connection을 보관 할 때 사용하는 아이
			PoolableConnectionFactory poolableConnFactory = new PoolableConnectionFactory(connFactory, null);
			poolableConnFactory.setValidationQuery("select 1");//커넥션이 유효한지 여부를 검사할 때 사용할 쿼리
			
			//[4] connection pool 설정 정보들...
			GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
			poolConfig.setTimeBetweenEvictionRunsMillis(1000L * 60L * 5L);//유휴 커넥션 검사 주기
			poolConfig.setTestWhileIdle(true);//풀에 보관 중인 커넥션이 유효한지 감사할지 여부
			poolConfig.setMinIdle(4);//커넥션 최소 개수
			poolConfig.setMaxTotal(50);//커넥션 최대 개수
			
			//[5] connection pool 생성: 커넥션을 보관할 아이를 생성하는 팩토리[3]와 설정정보[4]를 파라미터로 받는다....
			GenericObjectPool<PoolableConnection> connectionPool = 
						new GenericObjectPool<>(poolableConnFactory, poolConfig);
			poolableConnFactory.setPool(connectionPool);//[3]에 커넥션 풀 연결
			
			//[6] 커넥션 풀을 제공하는 jdbc 드라이버 등록
			Class.forName("org.apache.commons.dbcp2.PoolingDriver");
			PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
			
			//[7] 커텍션 풀 드라이버[6]에 connection pool 등록 및 이름 설정
			String poolName = getServletConfig().getInitParameter("poolName");
			driver.registerPool(poolName, connectionPool);//jdbc:apache:commons:dbcp:ch17
		} catch (Exception e) {
			//throw new RuntimeException(e);
			logger.error(e);
		}		
	}
}

※ Class.forName(driver)

  • Class: 이곳에 클래스 정보가 있어야 JVM이 driver class를 찾을 수 있고, ClassNotFoundException이 발생하지 않는다.
  • Class.forName(driver.calss) = 해당 클래스를 메모리에 로드하는 것!
    : 이렇게 driver 클래스가 로딩이 이루어지면, 즉 인스턴스화 되면
    : 내부적으로 DriverManager에 register(등록)되고
    : 따라서 Connection con = DriverManager.getConnection()이 가능!

vs 명시적 로딩

Ex) String str = new String("test");

2) web.xml

  • java클래스를 servlet으로 등록
  • init-param: servlet내에서 사용할 수 있는 파라미터를 저장

  • init-param 꺼내는 법
Ex) String driver = getServletConfig().getInitParameter("jdbcDriver");

※ context-param
: 모든 서블릿이 공유하고자 하는 파라미터 저장

//꺼내올때
String str = getServletConText().getInitParameter("jdbcDriver");

3) ConnectionPool를 사용한 db연동 코드

String jdbcDriver = "jdbc:apache:commons:dbcp:ch17";//마지막: 커넥션풀 이름
String sql ="select name from member";
Connection con = DriverManager.getConnection(jdbcDriver);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
...
}

0개의 댓글