여러명이 동시에 접속한 경우

 

JDBC 

- try 리소스나 close만 잘해도 큰 문제는 생기지 않음

 

단, 동시접속 con이 수백개 생기는 경우... 대기 번호

 

 

JDBC 만 쓰는 경우 적정 규모의 커넥션에는 문제 없지만 수백 이상의 접속은 어려움

 

대량접속을 대비한 DBCP로 줄세우기 필요

 

conection pool


기존 코드

	private Connection getConnection() throws Exception{
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String id = "kh";
		String pw = "kh";
		Class.forName("oracle.jdbc.driver.OracleDriver");
		return DriverManager.getConnection(url,id,pw);
	}

	private BasicDataSource bds = new BasicDataSource(); // 인스턴스 생성
	
	private Connection getConnection() throws Exception{
			bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
			bds.setUsername("kh");
			bds.setPassword("kh");
			bds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
			bds.setInitialSize(30);
			return bds.getConnection();
	}

[이 코드의 문제]

getConnection() 부를 때마다 초기화

초기화 코드를 생성자로 뺌 


	private BasicDataSource bds = new BasicDataSource(); // 인스턴스 생성
	
	public BoardDAO() { // 생성자 - 한번만 호출
		bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		bds.setUsername("kh");
		bds.setPassword("kh");
		bds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		bds.setInitialSize(30);
	}
	
	private Connection getConnection() throws Exception{
			return bds.getConnection();
	}

[이 코드의 문제]

new BoardDAO(); 는 doGet에서 한번만 사용?

톰캣에서 doGet / doPost는 쓰레드로 병렬 처리되고 있음

 

접속 인원수에 따라 BoardDAO(); 인스턴스가 생성된다.

- 3명 들어오면 커넥션풀 90개 생성


싱글턴 인스턴스 패턴 사용

BoardDAO(); 인스턴스를 한번만 생성하도록 막기

	private BasicDataSource bds = new BasicDataSource(); // 인스턴스 생성
	
	public static BoardDAO instance = null;
	
	public static BoardDAO getInstance() {
		if(instance == null) {
			instance = new BoardDAO(); //private이 걸려있어도 코드 내부이므로 사용가능
		}
		return instance;
	}
	
	private BoardDAO() {
		bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		bds.setUsername("kh");
		bds.setPassword("kh");
		bds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		bds.setInitialSize(30);
	}
	
	private Connection getConnection() throws Exception{
			return bds.getConnection();
	}

 

병렬처리가 일어나는 웹서버에서는

첫번째 사람의 코드가 실행되는 순간에

두번째 사람이 들어오는 경우도 있다.


synchronized 동기화 코드 사용

	private BasicDataSource bds = new BasicDataSource(); // 인스턴스 생성
	
	public static BoardDAO instance = null;
	
	public synchronized static BoardDAO getInstance() {
		if(instance == null) {
			instance = new BoardDAO();
		}
		return instance;
	}
	
	private BoardDAO() { // 생성자 - 초기화 코드만 담기
		bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		bds.setUsername("kh");
		bds.setPassword("kh");
		bds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		bds.setInitialSize(30);
	}
	
	private Connection getConnection() throws Exception{
			return bds.getConnection();
	}

dao가 여러개 (멤버/보드/댓글...)

접속하자 마자 여러개의 커넥션 생성


JNDI

 

설정을 우리가 하지 말고 톰캣이 하도록 하기

xml의 종료태그 />

 

Servers > context.xml

    <Resource name ="dbcp"
    		  auth ="Container"
    		  type ="javax.sql.DataSource"
    		  username = "kh"
    		  password = "kh"
    		  driverClassName = "oracle.jdbc.driver.OracleDriver"
    		  url = "jdbc:oracle:thin:@localhost:1521:xe"
    		  initialSize = "30" />

Container : Tomcat -> 서블릿Container

 

 

BoardDAO

	private Connection getConnection() throws Exception{
			Context ctx = new InitialContext();
			DataSource ds = (DataSource)ctx.lookup("java:comp/env/dbcp"); //경로
			return ds.getConnection();
	}

정상 실행은 되는데 에러메세지 발생

에러가 거슬리다면 ojdbc6.jar 옮기기

+ Recent posts