음.. 현재 파일마다 DB접근하잖아..
컨트롤러 마다 BoardDao호출하면 메서드마다 getConnection()하잖아.. 이게 현재 로컬에서 혼자만 돌리니까 문제가 없지만 이게 동접자가 많아지면 이야기가 틀려지지..
어제까지 동접자 1000명이 메스컴타고 10000이 될 수도 있잖아. 이래서 뻗어버리느니 일정 숫자이상이면 튕겨버리는게 낫잖아..
그래서 connection pool을 만들어.. 이 넘이 jdbc를 호출해서 db에 붙어.. 이걸 붙일때 어떻게 붙이느냐.. max를 100개라고 커넥션갯수를 지정하면 알아서 100개를 연결해 놔. 우리가 쓸려고 하면 남은게 있으면 써.. 그러니까 접속하는 시간이 안걸려.. 그리고 일정용량이상의 의도하지않은 사람이 접속하려고 하면 접속이 안되서 DB서버가 안정적으로 돌아가..
이런 방식이 connection pooling방식이라고 해.
네이밍으로 서버단에 등록을 해놓고 바로 사용하는 방법이 JNDI(Java Naming and Directory Interface)이다.
우선 JNDI으로 써 보고, 그 다음 connection pooling방식으로 바꿔보고, 또 spring jdbc로 바꿔보고, iBatis로 바꿔보고 할 거야..
먼저 JNDI방식을 써보자..
server.xml에 Resource등록(이름은 OracleCP라고 하자)
<GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/> <Resource name="OracleCP" auth="Container" driverClassName="oracle.jdbc.OracleDriver" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:xe" username="oraclejava" password="oraclejava" maxActive="200" maxWait="-1" /> </GlobalNamingResources>
Resource이름은 OracleCP, 인증은 Container에서 할거야..
그다음 아래 webdev에 Resource링크시켜..
<!-- <Context docBase="webdev" path="/webdev" reloadable="true" source="org.eclipse.jst.jee.server:webdev"/></Host> --> <Context docBase="webdev" path="/webdev" reloadable="true" source="org.eclipse.jst.jee.server:webdev"> <ResourceLink global="OracleCP" name="OracleCP" type="javax.sql.DataSource"/> </Context></Host>
(global은 위의 Resource name이고, name은 내부에서 우리프로젝트에서 사용할 이름인데 바꿔줘도 되지만 헷갈리니까 그냥 그대로 쓰고..)
이게 JNDI방법이야.
간단히 Model1방식으로 테스트 해보자.
/webdev/WebContent/jdbc/jdbcTest.jsp를 카피해서 dbcpTest.jsp만들어 수정.
<%@page import="javax.sql.DataSource"%> <%@page import="javax.naming.Context"%> <%@page import="javax.naming.InitialContext"%> <%@page import="java.sql.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% Connection cn = null; Statement st = null; ResultSet rs = null; try { Context init = new InitialContext(); DataSource ds = (DataSource)init.lookup("java:comp/env/OracleCP"); cn = ds.getConnection(); st = cn.createStatement(); rs = st.executeQuery("select last_name, salary from employees "); out.println("\t[급여 명세표]<br/>"); out.println("==============================<br/>"); out.println("이름\t급여"); while(rs.next()){ out.print(rs.getString("last_name")+ "\t"); out.print(rs.getInt("salary")+ "\n<br/>"); } out.println("==============================<br/>"); } catch (Exception e) { e.printStackTrace(); } finally { //자원해지(반드시 만든 순서의 역순으로) if (rs != null) try { rs.close();} catch (SQLException e) {} if (st != null) try { st.close();} catch (SQLException e) {} if (cn != null) try { cn.close();} catch (SQLException e) {} } %> </body> </html>
다음시간엔 이 방법이 불편한 이유 알아보고, 더 편한 방식으로 바꿔볼거구.. 나머지 기능 구현하고.. 쿠키도 모델2로 바꾸고..
'Java, Spring > 09일' 카테고리의 다른 글
9일차 1 - Java Project Import하기, 서버환경에서 띄우기 (0) | 2012.09.20 |
---|---|
9일차 2 - Model2 개념 복습 및 로그인에 적용 (0) | 2012.09.20 |
9일차 3 - properties 파일 적용하기 (0) | 2012.09.20 |
9일차 4 - 게시판 List구현 & JSTL (0) | 2012.09.20 |
9일차 5 - 게시판 글쓰기, 글보기 구현 (0) | 2012.09.20 |