Spring Boot 애플리케이션에서 Oracle 데이터베이스 커넥션 풀을 효율적으로 관리하는 방법을 설명합니다.
- HikariCP를 통한 효율적인 커넥션 풀 관리
- 실시간 커넥션 상태 모니터링
- 문제 상황 발생 시 알림 기능
- 성능 최적화를 위한 설정 가이드
<dependencies>
<!-- Oracle JDBC Driver -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.5.0.0</version>
</dependency>
<!-- HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
</dependencies>spring:
datasource:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:YOUR_SID
username: your_username
password: your_password
hikari:
pool-name: HikariCP
maximum-pool-size: 10
minimum-idle: 5
idle-timeout: 300000 # 5분
connection-timeout: 20000 # 20초
validation-timeout: 5000 # 5초
max-lifetime: 1200000 # 20분
connection-test-query: SELECT 1 FROM DUAL@Configuration
public class DatabaseConfig {
@Bean
@ConfigurationProperties("spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean
public DataSource dataSource() {
return new HikariDataSource(hikariConfig());
}
}@Component
@Slf4j
public class DatabaseConnectionManager {
private final HikariDataSource dataSource;
public DatabaseConnectionManager(DataSource dataSource) {
this.dataSource = (HikariDataSource) dataSource;
}
@PostConstruct
public void init() {
log.info("Total connections: {}", dataSource.getHikariPoolMXBean().getTotalConnections());
log.info("Idle connections: {}", dataSource.getHikariPoolMXBean().getIdleConnections());
log.info("Active connections: {}", dataSource.getHikariPoolMXBean().getActiveConnections());
}
}@RestController
@RequestMapping("/admin")
public class DatabaseMonitorController {
private final HikariDataSource dataSource;
@GetMapping("/db/status")
public Map<String, Object> getConnectionPoolStatus() {
Map<String, Object> status = new HashMap<>();
status.put("totalConnections", dataSource.getHikariPoolMXBean().getTotalConnections());
status.put("activeConnections", dataSource.getHikariPoolMXBean().getActiveConnections());
status.put("idleConnections", dataSource.getHikariPoolMXBean().getIdleConnections());
return status;
}
}| 설정 항목 | 권장값 | 설명 |
|---|---|---|
| maximum-pool-size | 10-20 | CPU 코어 수 * 2 |
| connection-timeout | 20000ms | 커넥션 획득 대기 시간 |
| idle-timeout | 300000ms | 유휴 커넥션 유지 시간 |
| max-lifetime | 1200000ms | 커넥션 최대 수명 |
- 커넥션 풀 크기는 데이터베이스 서버 설정을 고려하여 설정
- 주기적인 모니터링 필수
- 문제 발생 시 즉각적인 알림 설정 필요
@Component
@Slf4j
public class ConnectionPoolListener {
@EventListener
public void handlePoolAlert(HikariPoolMXBean.PoolAlert alert) {
log.error("Connection pool alert: {}", alert.getMessage());
// 알림 발송 로직 구현
}
}-
커넥션 부족 현상
- maximum-pool-size 증가 검토
- 트랜잭션 처리 시간 최적화
- 불필요한 커넥션 사용 제거
-
성능 저하
- connection-timeout 설정 검토
- idle-timeout 조정
- 쿼리 최적화 검토
@Repository
@Slf4j
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional
public void save(User user) {
String sql = "INSERT INTO USERS (NAME, EMAIL) VALUES (?, ?)";
jdbcTemplate.update(sql, user.getName(), user.getEmail());
}
}이 프로젝트는 MIT 라이선스로 제공됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
- 이 저장소를 포크합니다
- 새로운 브랜치를 생성합니다
- 변경사항을 커밋합니다
- 브랜치에 푸시합니다
- Pull Request를 생성합니다
⭐ 이 프로젝트가 도움이 되었다면 스타를 눌러주세요!