728x90
반응형
DBCP (Database Connection Pool)
- DB로 작업을 수행할 때마다 새로운 DB 연결을 생성하는 것이 자원의 낭비가 되기 때문에 연결들을 미리 생성해두는 객체
- 커넥션풀을 사용하면 DB와의 연결을 맺고 끊는 과정이 생략되기 때문에 (대신 빌리고 반환하며 사용) 서버 성능이 크게 향상된다.
- DB와의 접속이 갑자기 활발해지면 연결을 더 늘리거나 한적해지면 연결을 다시 최소한으로 유지하는 등의 기능을 제공한다.
유명한 자바 DBCP 라이브러리들
- Apache Commons DBCP
- Hikari CP
- ...
pom.xml에 Hikari 적용하는 법
Hikari root-context.xml 설정법 (객체 생성)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 자바빈 형태의 클래스는 xml을 통해 컨텍스트에 등록할 수있다. -->
<bean id="hikariConfig" 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" />
<property name="minimumIdle" value="3"/>
<property name="maximumPoolSize" value="10"/>
<property name="idleTimeout" value="600000"/>
</bean>
<bean id="hikariDataSource" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikariConfig"/>
</bean>
</beans>
Hikari DB Connection 설정법 (객체 생성)
package com.ezen.springdatabase.dbcp;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class DBConnection {
public static HikariDataSource getDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
config.setUsername("hr");
config.setPassword("1234");
config.setMinimumIdle(3); // 3개까지는 아무리 놀아도 유지하겠다
config.setMaximumPoolSize(10); // 최대 10개의 연결까지 늘릴 수 있다.
config.setIdleTimeout(1000 * 60 * 10); // 10분 놀면 연결을 해제한다.
// 설정을 전달해 DB Connection Pool 객체를 생성
return new HikariDataSource(config);
}
}
root-context.xml Test 해보기 (1)
import javax.sql.DataSource;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.log4j.Log4j;
@Log4j
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class DBCPTest {
@Autowired
HikariDataSource dataSource;
@Test
public void contextTest() {
log.info(dataSource);
assertNotNull(dataSource);
}
}
DBConnection Test 해보기 (2)
package com.ezen.springdatabase.dbcp;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.Test;
public class DBCPTest {
@Test
public void dsTest() {
DataSource ds = DBConnection.getDataSource();
String sql = "SELECT * FROM employees";
// HikariDataSource로부터 꺼낸 Connection은 close해도 끊기지 않고 반환된다.
try (
Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
) {
while (rs.next()) {
System.out.printf("%s/%d\n", rs.getString("first_name"),
rs.getInt("salary"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
728x90
반응형
'Spring' 카테고리의 다른 글
[Spring] 프로젝트 계층 분리 (0) | 2023.07.11 |
---|---|
[Spring] Mybatis (0) | 2023.07.06 |
[Spring] Controller (0) | 2023.07.04 |
[Spring] Lombok (0) | 2023.07.04 |
[Spring] Log4j (0) | 2023.07.04 |