java/jsp & sevlet

connection pool

tea-tea 2024. 5. 4. 13:47

conntection pool은 DB와의 통신 리소스를 절약 및 관리하는 방법 중 한가지다.

유저의 매 요청마다 DB를 반복적으로 열고 쿼리하고 닫는 작업은 비효율적이라 성능에 좋지 않다.

따라서, 커넥션 풀은 서버가 유저의 요청 이전에 미리 db와 연결을 만들어놓고 필요할때 빌려쓴 후 반환하는 방식이다.

 

방법


1. 톰켓 컨테이너에서 설정

  1. 톰켓 설정 파일/context.xml
  2. Resource태그 수정
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!-- <Manager pathname="" /> -->
<!-- auth, 톰 켓 컨테이너를 풀로 사용하겠단 명시 -->
<!-- name, 자바 코드에서 커넥션 풀을 가져오기 위한 이름, 작명 자유 -->
<!-- type, 커넥션 풀 생성에 이용한 객체 api -->
<!-- maxActive,미리 생성할 숫자. 이 숫자 다 사용하고 초과 요청 시, 추가로 자동생성 -->
<!-- maxWait, Connection Pool에서 사용 가능한 커넥션이 없을 때 최대 대기 시간. 밀리초 단위. 초과 시 에러 발생 -->

<Resource
auth="Container"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="유저네임"
password="비밀번호"
name="jdbc/Oracle21c"
type="javax.sql.DataSource"
maxActive="4"
maxWait="10000"
/>

 

2. servlet 파일에서 커넥션 풀 이용

 

package com.DAO;
import com.DTO.BookDTO;

public class BookDAO {
	DataSource dataSource;
	Connection conn = null;
	PreparedStatement pstmt = null;

	public BookDAO() {
		try {
			Context context = new InitialContext();
			this.dataSource = (DataSource) context.lookup("java:comp/env/jdbc/Oracle21c");

		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

	public ArrayList<BookDTO> selectAll() {
		ArrayList<BookDTO> results = new ArrayList<BookDTO>();

		try {

			this.conn = dataSource.getConnection();
			String query = "SELECT * FROM book";
			this.pstmt = conn.prepareStatement(query);
			ResultSet result = pstmt.executeQuery();

			while (result.next()) {
				int bookId = result.getInt("book_id");
				String bookName = result.getString("book_name");
				BookDTO bookDTO = new BookDTO(bookId, bookName);
				results.add(bookDTO);

			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				pstmt.close();
				conn.close();

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return results;
	}
}