[데브코스] JDBC 2
Updated: Categories: TILW4D3 - Data Source(HikariCP) / JDBC Template 에 대해 공부하자!
Data Source
DBCP (DataBase Connection Pool)
- 앞서 살펴본 DB 커넥션 단계는 3단계로 이루어져 있음
- DB에 쿼리를 날릴때마다 커넥션을 맺는 과정을 반복하는건 매우 비효율적이다.
- 따라서 DataSource에 커넥션 풀을 관리하여 반복 생성하지 않도록 한다.
- 커넥션 close도 실제로 연결을 끊는것이 아닌 커넥션 풀에 반환하는것
- Spring에서는
spring-boot-starter-jdbc
모듈을 설치해 이를 사용할 수 있다- HikariCP
- Spring JDBC
HikariCP
연동방법
- DataSource Bean을 정의할때 DB 접속정보를 넣어준다
@Bean
public DataSource dataSource() {
var dataSource = DataSourceBuilder.create()
.url("jdbc:mysql://주소/DB명")
.username("호스트명")
.password("패스워드")
.type(HikariDataSource.class)
.build();
return dataSource;
}
- 커넥션을 불러올땐
dataSource.getConnection()
으로 불러오면 된다!
Connection Pool
- DataSource에서 커넥션 풀을 어떻게 사용하는지 확인해보자
show status like '%Threads%';
- 연결 전엔 DB에서 스레드 상태를 보면 1개만 연결되어있는걸 확인할 수 있음
@Test
public void 테스트 throws InterruptedException {
[DB 커넥션 사용 로직]
Thread.sleep(5000);
}
- 이제 커넥션을 맺고 스레드를 5초간 멈춘 후 다시 DB를 확인해보면
- 스레드 연결이 10개가 늘어난다.
- 이를 보면 DB 커넥션이 시작되면 -> 커넥션 풀에 커넥션 10개(default)를 생성한다는 것을 알 수 있다.
- 커넥션 생성을 늘리려면? -> Bean 정의시 커넥션 수를 정해줄 수 있음
dataSource.setMaximumPoolSize()
: 우선 Pool 사이즈를 늘려주고dataSource.setMinimumIdle()
: 생성할 커넥션 수를 정해준다
JDBC Template
query(쿼리, RowMapper, 쿼리인자값, ...)
: 결과값을 여러개 받아올 때 List로 반환됨.queryForObject(쿼리, RowMapper, 쿼리인자값, ...)
- 결과값을 하나만 받아오고 싶을 때
- 쿼리에 인자값을 넣어 날림 (내부에서 PreparedStatement가 동작함)
count
같이 결과가 int 값 하나 나올때도 사용한다. ->(쿼리, Integer.class)
update(쿼리, 쿼리인자값, ...)
: 업데이트 후 성공했다면1
을 리턴