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)
vs 명시적 로딩
Ex) String str = new String("test");
Ex) String driver = getServletConfig().getInitParameter("jdbcDriver");
※ context-param
: 모든 서블릿이 공유하고자 하는 파라미터 저장
//꺼내올때 String str = getServletConText().getInitParameter("jdbcDriver");
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()){ ... }