지금까지 DAO를 쓸 때마다 Connection객체를 생성하고 해당 메서드가 끝나면 자원을 해제하고를 반복했다.

//접속 개체 얻기 
	public Connection getConnection(){
		Connection con=null;//return 시키기 위해..
		try{
		Class.forName(driver);
		System.out.println("드라이버 로드 성공");

		con = DriverManager.getConnection(url, user,password);
	
		}catch(ClassNotFoundException e){
			e.printStackTrace();
			System.out.println("드라이버 로드 실패");
		}catch(SQLException e){
			e.printStackTrace();	
		}
		return con;
	}

	//자원해제
	public void release(Connection con){//쿼리문 수행 안했을 때..
		if(con!=null){
			try{
				con.close();	
			}catch(SQLException e){
				e.printStackTrace();
			}
		}
	}

 

웹페이지를 만들어서 많은 사람들이 사용한다고 생각해보면 많은 사람들이 페이지에 접속하고 사용할 때마다
Connection을 받고 바로 해제하고 이러한 과정이 반복된다.
DB로부터 Connection을 얻는 행동은 엄청난 자원을 필요로 하는데 (쿼리, 유저맞어?, 권한?...)
우리는 지금까지 그런 소중한 자원을 썻다 바로 버리고 있었다....;;; 

 

이런 고충을 해결하기 위해 Connection Pool을 이용해보자

 

나는 Tomcat에서 지원하는 Connection Pool을 사용했다.

1) server.xml

    <!--톰캣서버의 server.xml 파일을 열어서 GlobalNamingResources태그 안에 넣어준다-->
    <!--myoracle은 개발자 마음대로 선언해주면 된다.-->
    <Resource name="jdbc/myoracle"
		auth="Container"
		type="javax.sql.DataSource"
        <!--driver의 위치-->
		driverClassName="oracle.jdbc.driver.OracleDriver"
        <!--사용하는 DB의 url-->
		url="jdbc:oracle:thin:@localhost:1521:XE"
        <!--유저의 id-->
		username="lastuser"
        <!--유저의 비밀번호-->
		password="lastuser"
		maxActive="20"
		maxIdle="10"
		maxWait="3000"/>

2) web.xml

	<resource-ref>
	<res-ref-name>jdbc/myoracle</res-ref-name><!--server.xml에서 썼던 이름와 동일하게!-->
	<res-type>javax.sql.DataSource</res-type>
	<res-auth>Container</res-auth>
	</resource-ref>

3) tomcat/context.xml

<ResourceLink type="javax.sql.DataSource"
                      name="jdbc/myoracle"
                      global="jdbc/myoracle" />
                      <!--여기도 이름을 동일하게!!-->

4) 사용방법 (테스트)

<html>
<head>
<%@ page
import="java.sql.*,
javax.sql.*,
java.io.*,
javax.naming.InitialContext,
javax.naming.Context" %>
</head>
<body>
<h1>JDBC JNDI Resource Test</h1>

<%
/*
JNDI란? 
JAVA Naming Directory interface : 어떤 정보를 프로그래밍 언어인 자바코드에 넣지 말고, 외부의 xml과 같은 자원으로 관리하는 방법 
(즉, 자바코드 안에 설정정보를 넣지 말고, 코드 밖으로 빼서 유지관리하자!)  server.xml
*/

InitialContext initCtx = new InitialContext(); //검색 객체
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/myoracle"); //검색객체가 안에 내용을 찾는다. server.xml의 datasource를 찾아나선다
//새로운 접속이 아니라, 이미 풀에 존재하는 접속 객체를 대여하는 것!
Connection conn = ds.getConnection();//커넥션풀로부터 하나의 커넥션을 얻는 작업!! 

Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("select * from board");
while (rset.next()) {
out.println("title=="+rset.getString("title")+"<br>");
}
rset.close();
stmt.close();
conn.close();
initCtx.close();
%>
</body>
</html>

 

JNDI란?

JAVA Naming Directory Interface : 어떤 정보를 프로그래밍 언어인 자바코드에 넣지 않고 외부의 xml과 같은 자원으로 관리하는 방법  (즉, 자바코드 안에 설정정보를 넣지 말고, 코드 밖으로 빼서 유지관리하자!) 

ex) server.xml, web.xml ..?

 

DataSource?

  • Connetion Pool을 관리하기 위한 객체!!!
  • Connection 획득과 반환 등의 작업을 한다! 
<Resource name="jdbc/myoracle"
		auth="Container"
		type="javax.sql.DataSource"
        <!--driver의 위치-->
		driverClassName="oracle.jdbc.driver.OracleDriver"
        <!--사용하는 DB의 url-->
		url="jdbc:oracle:thin:@localhost:1521:XE"
        <!--유저의 id-->
		username="lastuser"
        <!--유저의 비밀번호-->
		password="lastuser"
		maxActive="20"
		maxIdle="10"
		maxWait="3000"/>
  • 위의 server.xml에서 넣어줬던 코드는 DataSource를 의미! (type="javax.sql.DataSource")

'프로그래밍 > JSP' 카테고리의 다른 글

JSP | 서블릿(Servlet) 이해  (0) 2020.12.16
JSP | session  (0) 2020.12.16
JSP | MyBatis 사용해보기  (0) 2020.12.10
JSP - 페이징 이해  (0) 2020.12.08
JSP - 이미지 업로드  (0) 2020.12.04

+ Recent posts