Spring

[Spring] Connection Pool

로아다 2023. 7. 6. 16:24
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>

root-context.xml의 Spring 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
반응형