java/jsp & sevlet
connection pool
tea-tea
2024. 5. 4. 13:47
conntection pool은 DB와의 통신 리소스를 절약 및 관리하는 방법 중 한가지다.
유저의 매 요청마다 DB를 반복적으로 열고 쿼리하고 닫는 작업은 비효율적이라 성능에 좋지 않다.
따라서, 커넥션 풀은 서버가 유저의 요청 이전에 미리 db와 연결을 만들어놓고 필요할때 빌려쓴 후 반환하는 방식이다.
방법
1. 톰켓 컨테이너에서 설정
- 톰켓 설정 파일/context.xml
- 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;
}
}