커넥션풀이란?

데이터베이스와 연결된 커넥션을 미리 만들어서 풀(pool) 속에 저장해 두고 있다가 필요할 때 커넥션을 풀에서 쓰고 다시 풀에 반환하는 기법을 말한다.

웹 프로그램에서는 데이터베이스의 환경설정과 연결 관리 등을 따로 XML파일이나 속성 파일을 사용해서 관리하고, 이렇게 설정된 정보를 이름을 사용하여 획득하는 방법을 사용한다.

- 웹 컨테이너가 실행되면서 커넥션(connection) 객체를 미리 풀(pool)에 생성해 둔다.

- DB와 연결된 커넥션(connection)을 미리 생성해서 풀(pool) 속에 저장해 두고 있다가 필요할 때에 가져다 쓰고 반환한다.

- 미리 생성해두기 때문에 데이터베이스에 부하를 줄이고 유동적으로 연결을 관리 할 수 있다.

출처: https://devbox.tistory.com/entry/JSP-커넥션-풀-1 [장인개발자를 꿈꾸는 :: 기록하는 공간]

클라이언트에서 다수의 요청이 발생할 경우 데이터베이스에 부하가 발생하게 된다.

이러한 문제를 해결 하기 위해서 커넥션 풀(DataBase Connection Pool)기법을 이용 한다.

IntelliJ 에서 커넥션풀을 연결해볼려고 한다.

tomcat-dbcp.jar 파일은 우리가 받은 tomcat 폴더안의 lib에 있다. (원래는 3개로 나뉘어져 있었다고 하는데 tomcat6.0 이상 부터 저렇게 하나로 통합 됬다고 한다.)

이 jar파일을 앞에도 했듯이 WEB-INF 폴더 안의 lib 폴더에 넣어주자.

이클립스에서는 [Servers] - [Tomcat v6.0 Server at localhost-config] 에 있는 context.xml 파일을 연다.

IntelliJ에서는

1. Project Structure -> Module -> Web -> Add Application Server specific descriptor... -> [클릭] -> Tomcat Server -> [선택]

2. context.xml 이 생성됩니다.

3. <Resource />로 JNDI를 설정하시면 각 개인별 설정이 가능합니다.

물론 META-INF/context.xml 파일은 git, svn에서 제외 시키셔야 각 개인별 사용이 가능합니다.

출처: okky

Ctrl + Alt + Shift + S 를 누른 후, 왼쪽 텝에서 Module을 클릭 후 오른쪽에 Web폴더를 선택하여 주고, 화면 중앙에 Add Application Server specific descriptor... 를 선택하면 뜨는 창에서 첫번째 선택창에 Tomcat Server를 선택하여주면 생성 된다.

Context.xml 은 이렇게 수정하여준다.

<Context> <Resource name="데이터베이스 이름" auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" type="javax.sql.DataSource" url="jdbc:oracle:thin:@ip주소:포트번호:전역 데이터베이스 이름" username="데이터베이스 아이디" password="데이터베이스 비밀번호" maxActive="20" maxIdle="10" maxWait="5000" /> </Context>

이 후 JNDI 를 설정하여 준다.

WEB-INF 의 web.xml에 아래와 같이 <resouce-ref> 태그를 넣어준다.

<resource-ref> <description>Connection</description> <res-ref-name>자신의 데이터베이스 이름</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

이 후 java나 jsp에서 커넥션풀과 JNDI를 통하여 DB와 연결된 것을 확인 할 수 있다. 반드시 DB 이름은 web.xml의 <res-ref-name>과 같아야 한다.

import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class OracleDBConnector { public static Connection getConnection() throws SQLException, NamingException, ClassNotFoundException { Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("ORCL"); //반드시 DB 이름은 web.xml의 <res-ref-name>과 같아야 한다. Connection con = ds.getConnection(); return con; } }

test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.sql.Connection" %> <%@ page import="DataAccess.OracleDBConnector" %> <%@ page import="java.sql.PreparedStatement" %> <%@ page import="java.sql.ResultSet" %> <html> <head> <title>ZeroLab</title> </head> <body> <p>아래는 DB 내용</p> <table border="3" bordercolor="skyblue"> <tr bgcolor="skyblue"><td>id<td>pw</tr> <% // 쿼리문 String query="select * from register"; // 커넥션 연결 Connection conn = OracleDBConnector.getConnection(); // DB에 쿼리문을 보낸다. PreparedStatement pstmt = conn.prepareStatement(query); ResultSet rs = pstmt.executeQuery(); // 결과값을 출력한다. while(rs.next()){ out.println("<tr>"); out.println("<td>"+rs.getString("ID")); out.println("<td>"+rs.getString("PW")); out.println("</tr>"); } %> </table> </body> </html>

이렇게 커넥션 풀을 이용하여 DB의 내용을 읽어오는 DAO 클래스의 함수이다. PreparedStatement를 이용하여 읽어온다.

import java.sql.*; public class MyDAO { private static MyDAO instance; //싱글톤 패턴 public MyDAO(){} public static MyDAO getInstance(){ if(instance == null) instance = new MyDAO(); return instance; } public ArrayList<MyDTO> RegisterSelect(){ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { StringBuffer query = new StringBuffer(); query.append("SELECT * FROM register"); conn = OracleDBConnector.getConnection(); pstmt = conn.prepareStatement(query.toString()); rs = pstmt.executeQuery(); while(rs.next()){ String id = rs.getString("id"); String pw = rs.getString("pw"); int Num = rs.getInt("num"); String title = rs.getString("title"); String contents = rs.getString("contents"); String date = rs.getString("date"); MyDTO dto = new MyDTO(id, pw, Num, title, contents, date); dtos.add(dto); } return dtos; } catch (Exception sqle) { throw new RuntimeException(sqle.getMessage()); } finally { try{ if ( pstmt != null ){ pstmt.close(); pstmt=null; } if ( conn != null ){ conn.close(); conn=null; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } }

'Java > JSP' 카테고리의 다른 글

Oracle JDBC 연결  (0) 2019.09.12
DB별 JDBC 드라이버 명 및 URL 형식  (0) 2019.09.12
DAO , DTO(VO) 작성  (0) 2019.09.12
IntelliJ-JDBC-MariaDB연결하기(JDBC)  (0) 2019.09.12
JSP 에러페이지, HTTP 에러코드 정리  (0) 2019.09.12

+ Recent posts