01_DB Connection Pool.txt
커넥션 풀 (DBCP, Database Connection Pool)
- 필요할 때마다 새로운 연결을 만드는 게 아니라
미리 만들어놓은 연결을 사용하여 새로운 연결을 계속해서 생성하는 자원의 낭비를 없애는 방법
- 만들어놓은 DB연결 객체들을 저장해놓은 곳을 Pool이라고 한다.
- 매번 데이터베이스에 새로운 연결을 맺는 것은 속도가 느려지기 때문에
커넥션 풀에서 미리 만들어진 연결을 꺼내 사용하면 쿼리문의 처리 속도가 매우 빨라진다.
- 웹서버가 실행될 때 연결을 미리 설정한 만큼 생성해두는 방식을 사용한다.
참고 https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/
유명 커넥션 풀 라이브러리
- Apache Commons DBCP
- Hikari CP - https://github.com/brettwooldridge/HikariCP
Hikari CP 세팅 가이드
1. 구글에 Hikari CP검색해서 뜨는 깃헙 주소 로 접속
https://github.com/brettwooldridge/HikariCP
2. 나는 자바 1.8이니까 8버전 디펜 복붙 (pom.xml)
HikariCP dependency
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
3. root-context.xml가서 빈 등록
HikariCP root-context
<bean id="config" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="username" value="hr"/>
<property name="password" value="1234"/>
</bean>
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="config"/>
</bean>
저장 후 Bean Graph에서 빈이 잘 등록 돼 있는 것을 확인
메이븐 업데이트 안 해도 되고
이제 이 빈들이 정상작동하는지 테스트해보기 위해
홈 컨트롤러 가서 오토와이어드로 ds 사용해보기
4. HomeController에서 DataSource ds를 @Autowired로 받아서 테스트
package com.ezen.database;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import lombok.extern.log4j.Log4j2;
@Log4j2
@Controller
public class HomeController {
@Autowired
DataSource ds;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
//http://localhost:8888/database/로 접속하면 뜰 것
//log.info("Home Controller!!");
log.info(ds);
//11:25:21:620 [http-nio-8888-exec-4] INFO com.ezen.database.HomeController - HikariDataSource (HikariPool-1)
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
}
log.info(ds); 를 콘솔에 출력했을 때
아래 달린 주석처럼 나오면 됨
+
세팅 가이드 3 번 빈등록 하기 전에 그냥 빈 등록 안 하고 써봄
1. 테스트용 클래스 하나 만들고 그 안에 HikariCP 깃헙에서 얻은 예시 코드 넣어보기
이 코드를 내가 사용하는 jdbc에 맞게 커스텀 하고 살을 더 붙여보면 아래와 같은 클래스가 만들어진다.
HikariTest.java
package mytest;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class HikariTest {
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setDriverClassName("oracle.jdbc.driver.OracleDriver"); //오라클 빌드패스 해주기
config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
config.setUsername("hr");
config.setPassword("1234");
// 이런 기능도 있다 ~ 나머지는 https://github.com/brettwooldridge/HikariCP 읽어보기
// config.setMinimumIdle(5);
// config.setMaximumPoolSize(10);
//잡다한 거
// config.addDataSourceProperty("cachePrepStmts", "true");
// config.addDataSourceProperty("prepStmtCacheSize", "250");
// config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);
try (
Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM employees");
ResultSet rs = pstmt.executeQuery();
){
while(rs.next()) {
log.info(rs.getString("first_name") + " " + rs.getString("last_name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
이러고 실행해봤더니 안 됨
왜냐하면 Maven이 jdbc를 자동으로 연결해주지 않기 때문에
우리가 수동으로 ojdbc8.jar파일을 Build Path 해주고, deployee
2. 프로젝트 우클릭 - Build Path - Configuration Build Path... - Add External JARs... 에서 ojdbc8.jar경로 추가
C:\JavaAWS\database\sqldeveloper-21.4.3.063.0100-x64\sqldeveloper\jdbc\lib 폴더에 위치
3. Web Deployment Assembly - Add .. - Java Build Path Entries 에서 ojdbc8.jar 패스 추가해주고 apply
4. 다시 HikariTest 실행