여러명이 동시에 접속한 경우
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 옮기기
'디지털 컨버전스 > Project' 카테고리의 다른 글
[세미프로젝트] html (0) | 2020.05.11 |
---|---|
[BoardProject] 파일 보관 (0) | 2020.05.08 |
[BoardProject] 댓글 달기 (댓글 테이블) (0) | 2020.05.08 |
[BoardProject] 일부 데이터만 출력 (0) | 2020.05.07 |
[BoardProject] 페이지 네비게이터 (0) | 2020.05.07 |