//Google AdSense

JNDI(Java Naming and Directory Interface)

디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API

외부에 있는 객체를 가져오기 위한 기술

 

DBCP(Database Connection Pool)

데이터베이스와 연결된 커넥션을 미리 만들어서 저장해두고 있다가 필요할 때 저장된 공간(pool)에서 가져다 쓰고 반환(소멸생성)하는 기법

데이터베이스 연결과 해제 직접 관리

DBCP(컨넥션) 구성

DBCP( 컨넥션 풀 ) 구성

풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는 데 드는 연결 시간이 소비되지 않는다.

커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 많지 않다.

커넥션 풀을 사용하면 커넥션을 생성하고 닫는 시간이 소모되지 않기 때문에 그만큼 어플리케이션의 실행 속도가 빨라지며, 또한 한 번에 생성될 수 있는 커넥션 수를 제어하기 때문에 동시 접속자 수가 몰려도 웹 어플리케이션이 쉽게 다운되지 않는다.

DBCP(컨넥션) 환경설정

DBCP 라이브러리 추가

  • Tomcat 6.x 이전 버전 commons-dbcp-1.4jar, commons-pool-1.6.jar, commons-collections-3.2.1-bin.zip 3개의 라이브러리 필요
  • Tomcat 6.x 이후 버전 tomcat-dbcp.jar (commons-*.jar 통합) (tomcat > lib 의 tomcat-dbcp.jar 존재)

DB Driver 라이브러리 추가

  • DB 버전 확인하고 이에 맞는 라이브러리 추가

Context 내에 Resource 추가 방법

  • Server.xml 이나 context.xml context 내에 resource 추가
  • 프로젝트내의 META-INFcontext.xml 생성 후 context 내에 resource 추가
  • Web.xml resource-ref 추가 (tomcat 버전 별 차이 있음)

 

context.xml
> Context 내에 Resource 추가
<?xml version="1.0" encoding="UTF-8"?>
<context> 

	<!-- 
	Resource를 등록하여 웹에서 JNDI로 호출할 이름과 정보를 설정. 
	각 db의 Driver jar 필요
	mariadb : org.mariadb.jdbc.Driver // jdbc:mariadb
	mysql : org.gjt.mm.mysql.Driver // jdbc:mysql
	
	-->
	<Resource 
  	name="jdbc/myCon" 
  	auth="Container" 
  	type="javax.sql.DataSource"
	factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
	driverClassName="com.mysql.jdbc.Driver"
	url="jdbc:mysql://localhost:3306/ksmart35db?autoReconnect=true&amp;characterEncoding=utf-8"
	username="root" 
	password="java0000" 
	maxActive="100" 
	maxIdle="30" 
	maxWait="10000"
	removeAbandoned="true" 
	removeAbandonedTimeout="60"/> 

  	<!-- 
	1. name : JNDI로 호출될 이름을 설정
	2. auth : DBCP를 관리할 관리자 (Container or Application) -
	3. type : 해당 resource의 return type - 
	4. factory : dbcp를 유용하는 관리 클래스 -
	5. driverClassName : JDBC를 이용하기 위한 드라이버 클래스
	6. url : DB의 접속 URL
	7. username : DB의 계정 명
	8. password : 계정에 대한 비밀번호
	9. maxActive : 최대 접속 허용 개수
	10. maxIdle : DB Pool에 여분으로 남겨질 최대 Connection 개수
	11. maxWait : DB 연결이 반환되는 Timeout의 최대 시간 (-1은 무한 대기)
	12. removeAbandoned : Connection이 잘못 관리되어 버려진 연결을 찾아 재활용할 것인지의 여부 설정
	13. removeAbandonedTimeout : 버려진 연결로 인식할 기본 시간 설정
	(초 단위로 해당 시간이 지나면 버려진 연결로 인식한다.)
	-->	  	

</context>

MyConnection.java
>db 연결
package kr.or.ksmart.dbConnection;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class MyConnection {
	public static Connection getConnection() {
		Connection con = null;
		try{			
			Context context = new InitialContext();
			DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/myCon");
			con = ds.getConnection();			
				
    	}catch(SQLException e){
			e.printStackTrace();
		}catch(NamingException e){
			e.printStackTrace();
		}
		return con;
	}
}
ConnectionTest.java
>connection test
package kr.or.ksmart;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import kr.or.ksmart.dbConnection.MyConnection;

/**
 * Servlet implementation class ConnectionTest
 */
@WebServlet("/ConnectionTest")
public class ConnectionTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ConnectionTest() {
        super();
        // TODO Auto-generated constructor stub
    }
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		Connection con = MyConnection.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = con.prepareStatement("SELECT u.u_name FROM user AS u WHERE u.u_id = 'id001'");
			rs = ps.executeQuery();
			if(rs.next()) {
				System.out.println(rs.getString("u_name"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try{
				if(con!=null) {con.close();}
				if(ps!=null) {ps.close();}
				if(rs!=null) {rs.close();}
			}catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

ConnectionTest.java 실행

화면

console log
...
정보: Server startup in 3883 ms
홍01

 

'JAVA' 카테고리의 다른 글

컨트롤러, 서비스, dao 및 트렌젝션  (0) 2020.05.14
DBCP 실습  (0) 2020.05.14
[JavaBasic] 인터페이스  (0) 2020.04.29
[JavaBasic] hashCode / equals / instanceof  (0) 2020.04.29

+ Recent posts