๐จ ์ด ๊ธ์ DB < ๋ฐฉํ๋ฒฝ > ์๋ฒ ๊ตฌ์กฐ์์ ๋ฐฉํ๋ฒฝ์ ํจํท ์ค์ธ์ผ๋ก ์ธํด ๋คํธ์ํฌ ์ ์ค ๋ฐ ์ปค๋ฅ์ ๋๊น ์ฅ์ ๋ฅผ ๊ฒฝํํ ํ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด HikariCP๋ฅผ ๊ณต๋ถํ๋ ๊ณผ์ ์์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
HikariCP๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ฉฐ ์์ ์ ์ธ JDBC ์ปค๋ฅ์
ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
์คํ๋ง ๋ถํธ 2.0 ์ดํ ๊ธฐ๋ณธ ์ปค๋ฅ์
ํ๋ก ์ฑํ๋ ๋งํผ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ด ๊ฒ์ฆ๋์์ผ๋ฉฐ
โ
๋ฎ์ ๋๊ธฐ ์๊ฐ(latency)
โ
๋์ ์ฒ๋ฆฌ๋(throughput)
โ
๊ฐ๋ ฅํ ์์ ์ฑ
์ ์๋ํฉ๋๋ค.
ํ์ง๋ง HikariCP๊ฐ ๋จ์ํ "๋น ๋ฅด๋ค" ๋ ์ด์ ๋ง์ผ๋ก ์ต๊ณ ์ ์ปค๋ฅ์
ํ์ด ๋ ๊ฒ์ ์๋๋๋ค.
๋ถํ์ํ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ , ๋น ๋ฅธ ์๋ต ์๋๋ฅผ ์ ์งํ๋ฉฐ, ์์ ์ฑ์ ๊ทน๋ํํ๋ ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ด ์ ์ฉ๋์ด ์์ต๋๋ค.
HikariCP๋ ๊ธฐ์กด ์ปค๋ฅ์
ํ๊ณผ ๋น๊ตํด ๋ถํ์ํ ๋๊ธฐํ๋ฅผ ์ต์ํํ๊ณ , ์ปค๋ฅ์
๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ต์ ํํ ๊ฒ์ด ํน์ง์
๋๋ค.
์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ๋ํ์ ์ธ ๊ธฐ์ ๋ค์ ์๊ฐํ๊ฒ ์ต๋๋ค.
๊ธฐ์กด์ ์ปค๋ฅ์ ํ๋ค์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋๊ธฐํ ๋น์ฉ์ด ๋ณ๋ชฉ(bottleneck)์ด ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
HikariCP๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด FastPath Pooling ๊ธฐ๋ฒ์ ๋์ ํ์ฌ ์ปค๋ฅ์ ํ์์ ์ปค๋ฅ์ ์ ๊ฐ์ ธ์ค๊ณ ๋ฐํํ๋ ๊ณผ์ ์ ๊ทน๋จ์ ์ผ๋ก ์ต์ ํํ์ต๋๋ค.
ConcurrentBag
์ ํ์ฉํ ๋น ๋ฅธ ์ปค๋ฅ์
ํธ๋ค๋ง โ FastPath Pooling ๋๋ถ์ ๋๊ธฐํ ๋น์ฉ์ ์ค์ด๊ณ ์ปค๋ฅ์ ํ๋ ์๋๋ฅผ ๊ทน๋ํํ ์ ์์ต๋๋ค.
HikariCP๋ ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ์ต์ํํ์ฌ ์ปค๋ฅ์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
Statement caching
)์ ์ ๊ฑฐํ์ฌ ๊ฒฝ๋ํ โ ์ด ๊ฒฐ๊ณผ, HikariCP๋ ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ์งํ๋ฉด์๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.
HikariCP๋ ๊ธฐ์กด์ "SELECT 1" ์ฟผ๋ฆฌ ๋ฐฉ์ ์ด ์๋, ๋คํธ์ํฌ ๊ธฐ๋ฐ ๊ฒ์ฆ(Network Timeout-based Validation) ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฅผ ํตํด DB ๋ถํ๋ฅผ ์ค์ด๊ณ ๋น ๋ฅธ ์ฅ์ ๊ฐ์ง๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
HikariCP๋ Socket Keep-Alive์ Network Timeout์ ํ์ฉํ ๊ฒ์ฆ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
โ 1. TCP ๋คํธ์ํฌ ์ํ ํ์ธ
โ 2. Socket Timeout์ ํ์ฉํ ๋น ๋ฅธ ๊ฐ์ง
connectionTimeout
๋ด์ ์๋ต์ด ์์ผ๋ฉด ํด๋น ์ปค๋ฅ์
์ ์ฆ์ ํ๊ธฐ โ 3. ๋น ๋ฅธ ์ฅ์ ๊ฐ์ง (Fast-Fail Detection)
validationTimeout
์ค์ ์ ํตํด ์ง์ ๋ ์๊ฐ ๋ด ์๋ต์ด ์์ ๊ฒฝ์ฐ ์ฆ์ ํ์์์ ์ฒ๋ฆฌ ๐ HikariCP ์ค์ (Spring Boot application.properties
)
# ๋น ๋ฅธ ์ฅ์ ๊ฐ์ง๋ฅผ ์ํ ์ค์
spring.datasource.hikari.validation-timeout=250
spring.datasource.hikari.connection-timeout=3000
์ค์ ๊ฐ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
---|---|---|
minimumIdle | ์ต์ํ์ผ๋ก ์ ์งํ ์ปค๋ฅ์ ์ | 10 |
maximumPoolSize | ์ต๋ ์ปค๋ฅ์ ๊ฐ์ | 10 |
idleTimeout | ์ ํด ์ํ์ ์ปค๋ฅ์ ์ ์ ์งํ๋ ์๊ฐ(ms) | 600000 (10๋ถ) |
maxLifetime | ์ปค๋ฅ์ ์ ์ต๋ ์๋ช (ms) | 1800000 (30๋ถ) |
connectionTimeout | ์ปค๋ฅ์ ์ ํ๋ํ๋ ์ต๋ ๋๊ธฐ ์๊ฐ(ms) | 30000 (30์ด) |
validationTimeout | ์ปค๋ฅ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ์ต๋ ์๊ฐ(ms) | 5000 (5์ด) |
leakDetectionThreshold | Connection Leak ๊ฐ์ง ์๊ฐ(ms) | 0 (๋นํ์ฑํ) |
๐ ์ค์ ๊ฐ ์กฐ์ ๊ฐ์ด๋
maximumPoolSize
: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ต๋ ์ปค๋ฅ์
์์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ ์์ฒญ๋์ ๊ณ ๋ คํ์ฌ ์ค์ idleTimeout
: ๋๋ฌด ์งง๊ฒ ์ค์ ํ๋ฉด ๋ถํ์ํ ์ปค๋ฅ์
์ฌ์์ฑ์ด ๋ฐ์ํ ์ ์์maxLifetime
: DB์ ์ค์ ๊ฐ๋ณด๋ค ์ฝ๊ฐ ์งง๊ฒ ์ค์ ํ์ฌ, DB์์ ์ปค๋ฅ์
์ด ๊ฐ์ ์ข
๋ฃ๋๊ธฐ ์ ์ ์์ ํ๊ฒ ๋ฐํ๋๋๋ก ์ค์ leakDetectionThreshold
: ํน์ ๊ฐ(์: 15000
ms)์ผ๋ก ์ค์ ํ๋ฉด ์ปค๋ฅ์
๋ฐํ์ด ๋ฆ์ด์ง๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ง ๊ฐ๋ฅHikariCP๋ ๋จ์ํ "๋น ๋ฅธ ์ปค๋ฅ์ ํ" ์ด ์๋๋๋ค.
๋ถํ์ํ ๋๊ธฐํ๋ฅผ ์ ๊ฑฐํ๊ณ , Connection ๊ฐ์ฒด๋ฅผ ์ต์ ํํ๋ฉฐ, ๋คํธ์ํฌ ๊ธฐ๋ฐ ๊ฒ์ฆ์ ์ํํ๋ ์ต์ ํ๋ JDBC ์ปค๋ฅ์ ํ์ ๋๋ค.
โ ์ฅ์ | ๐ ์ค๋ช |
---|---|
๋ฎ์ ๋ ์ดํด์์ ๋์ ์ฒ๋ฆฌ๋ | FastPath Pooling๊ณผ ์ต์ ํ๋ Connection ๊ด๋ฆฌ |
๋ถํ์ํ ๋ฆฌ์์ค ๋ญ๋น ์ต์ํ | ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ต์ ํ ๋ฐ Proxy ๊ฐ์ฒด ์ต์ํ |
๊ฐ๋ ฅํ ์ฅ์ ๊ฐ์ง ๋ฐ ๋ณต๊ตฌ | Network Timeout ๊ธฐ๋ฐ ๊ฒ์ฆ๊ณผ Fast-Fail Detection |
๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์์ ์์ ์ฑ | Lock-Free ๊ตฌ์กฐ์ ConcurrentBag ์ฌ์ฉ |
๊ทธ๋ฅ ์คํ๋ง ๋ถํธ์ ๋ถ์ด์์ผ๋ ์๋ฌด ์๊ฐ ์์ด ์ฌ์ฉํ์ง๋ง ์ ๋ฉ์ด์ ํ๋ ์์ํฌ๊ฐ ์ฑํํ๋์ง ์ ์ ์๋ ๊ณต๋ถ์๊ฐ ์ด์์ต๋๋ค.
๐ ์ฐธ๊ณ ๋ฌธ์
๐ Welcome to the Jungle (HikariCP ๊ณต์ ๋ฌธ์)