์ ํ๋ฆฌ์ผ์ด์ ์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํจ์จ์ ์ธ ์ฐ๊ฒฐ์ ์ํด ์ปค๋ฅ์ ํ์ ์ฌ์ฉํฉ๋๋ค. ์ปค๋ฅ์ ํ์ ๋ฏธ๋ฆฌ ์ผ์ ํ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์์ฑํด ๋๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ํ ๋๋ง๋ค ์ด ์ฐ๊ฒฐ๋ค์ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ๋งค๋ฒ ์๋ก ์์ฑํ๋ ๋์ ์ด๋ฏธ ์ค๋น๋ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต ์๊ฐ์ ์ค์ด๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ปค๋ฅ์ ํ ์ค ํ๋๋ HikariCP์ ๋๋ค. HikariCP๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ์ปค๋ฅ์ ํ๋ก, ๋๊ท๋ชจ ํธ๋ํฝ์ด ๋ฐ์ํ๋ ์ํฉ์์๋ ํจ์จ์ ์ธ ์ฐ๊ฒฐ ๊ด๋ฆฌ๋ฅผ ์ง์ํฉ๋๋ค. HikariCP๋ HikariPoolMXBean๊ณผ HikariConfigMXBean์ด๋ผ๋ JMX(Java Management Extensions)๋ฅผ ํตํด ์ปค๋ฅ์ ํ์ ์ํ ๋ฐ ์ค์ ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ค์ ํญ๋ชฉ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
---|---|---|
maximum-pool-size | ์ปค๋ฅ์ ํ์์ ์ ์งํ ์ ์๋ ์ต๋ ์ปค๋ฅ์ ์์ ๋๋ค. ์ด ์์น๋ฅผ ์ด๊ณผํ๋ ์์ฒญ์ ๋๊ธฐ ์ํ๋ก ๋ค์ด๊ฐ๋๋ค. | 10 |
minimum-idle | ํ์์ ์ ์งํ ์ ํด ์ปค๋ฅ์ ์ ์ต์ ๊ฐ์์ ๋๋ค. ์ ํด ์ปค๋ฅ์ ์ด ์ด ์์น ์ดํ๋ก ๋จ์ด์ง๋ฉด ์๋ก์ด ์ปค๋ฅ์ ์ด ์์ฑ๋ฉ๋๋ค. | maximum-pool-size ๊ฐ๊ณผ ๋์ผ |
connection-timeout | ์ปค๋ฅ์ ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ค๋ ๋๊ฐ ๋๊ธฐํ ์ ์๋ ์ต๋ ์๊ฐ์ ๋๋ค. ์ด ์๊ฐ์ด ์ด๊ณผ๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. | 30,000ms (30์ด) |
max-lifetime | ์ปค๋ฅ์ ์ด ์ ์ง๋ ์ ์๋ ์ต๋ ์๊ฐ์ ๋๋ค. ์ด ์๊ฐ์ด ์ง๋๋ฉด ์ปค๋ฅ์ ์ ํ๊ธฐ๋๊ณ ์ ์ปค๋ฅ์ ์ผ๋ก ๊ต์ฒด๋ฉ๋๋ค. | 1,800,000ms (30๋ถ) |
idle-timeout | ์ ํด ์ํ์ ์ปค๋ฅ์ ์ด ํ์์ ์ ์ง๋ ์ ์๋ ์ต๋ ์๊ฐ์ ๋๋ค. ์ด ์๊ฐ์ด ์ง๋๋ฉด ์ ํด ์ปค๋ฅ์ ์ด ํ์์ ์ ๊ฑฐ๋ฉ๋๋ค. | 600,000ms (10๋ถ) |
leak-detection-threshold | ์ง์ ๋ ์๊ฐ(๋ฐ๋ฆฌ์ด) ๋์ ์ฌ์ฉ๋์ง ์์ ์ปค๋ฅ์ ์ ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์๊ฐ์ด ์ง๋๋ฉด ์ปค๋ฅ์ ๋ฆฌํฌ(leak)๋ฅผ ์์ฌํ๊ณ ๊ฒฝ๊ณ ๋ฅผ ๋จ๊น๋๋ค. | 0 (๋นํ์ฑํ) |
pool-name | ์ปค๋ฅ์ ํ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก HikariCP๋ ์๋์ผ๋ก ์ด๋ฆ์ ์์ฑํ์ง๋ง, ํ์์ ๋ฐ๋ผ ์ง์ ํ ์ ์์ต๋๋ค. | ์๋ ์์ฑ๋ ์ด๋ฆ |
auto-commit | ์ ์ปค๋ฅ์ ์ด ์๋ ์ปค๋ฐ ๋ชจ๋๋ก ์์ํ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๊ฐ ์ฟผ๋ฆฌ ํ ์๋์ผ๋ก ์ปค๋ฐ๋ฉ๋๋ค. | true |
validation-timeout | ์ปค๋ฅ์ ์ด ์ ํจํ์ง ๊ฒ์ฆํ ๋ ์ฌ์ฉํ ์ต๋ ์๊ฐ์ ๋๋ค. ์ด ์๊ฐ์ด ์ด๊ณผ๋๋ฉด ์ปค๋ฅ์ ์ ์ ํจํ์ง ์๋ค๊ณ ํ๋จํ๊ณ ํ๊ธฐ๋ฉ๋๋ค. | 5,000ms (5์ด) |
read-only | ์ปค๋ฅ์ ์ด ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋์์ ์๋ํ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. | false |
isolate-internal-queries | ๋ด๋ถ ์ฟผ๋ฆฌ(์: ์ปค๋ฅ์ ํ์ ์ ์ง ๊ด๋ฆฌ ์ฟผ๋ฆฌ)๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฟผ๋ฆฌ์ ๊ฒฉ๋ฆฌ๋๋์ง๋ฅผ ์ค์ ํฉ๋๋ค. | false |
allow-pool-suspension | ์ปค๋ฅ์ ํ์ ์ผ์ ์ ์ง ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค. ์ด ์ค์ ์ด ํ์ฑํ๋๋ฉด ํ์ ์ผ์ ์ ์งํ๊ฑฐ๋ ๋ค์ ์์ํ ์ ์์ต๋๋ค. | false |
initialization-fail-timeout | ํ์ ์์ํ ๋ ์ด๊ธฐํ์ ์คํจํ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ ํ์์์ ์๊ฐ์ ๋๋ค. ์ด ์๊ฐ์ด ์ง๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. | 1์ด (1,000ms) |
maximumPoolSize
๊ฐ 10์ธ ์ปค๋ฅ์
ํ์ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์
์์, 10๋ช
์ ์ฌ์ฉ์๊ฐ ๊ฐ๊ฐ 1์ด์ ํ ๋ฒ์ฉ ์์ฒญ์ ๋ณด๋ธ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ ์์ฒญ์ ์ฝ 1์ด๊ฐ ์์๋ฉ๋๋ค. ์๋ ์๋๋ฆฌ์ค๋ ์ปค๋ฅ์
ํ์ ์ํ๋ฅผ ๊ฐ ๋จ๊ณ๋ณ๋ก ์ค๋ช
ํฉ๋๋ค.
- maximumPoolSize:
- ์ค๋ช : ์ปค๋ฅ์ ํ์์ ๊ด๋ฆฌํ ์ ์๋ ์ต๋ ์ปค๋ฅ์ ์๋ฅผ ๋ํ๋ ๋๋ค. ์ด ์๋๋ฆฌ์ค์์๋ 10๊ฐ๋ก ์ค์ ๋์ด ์์ด, ๋์์ ์ต๋ 10๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ด๋ฏธ์ง ์ค๋ช
: ์ด๋ฏธ์ง์์
totalConnections = 10
์ผ๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ, ์ด๋ ์ปค๋ฅ์ ํ์์ ๊ด๋ฆฌํ ์ ์๋ ์ด ์ปค๋ฅ์ ์ด 10๊ฐ์์ ์๋ฏธํฉ๋๋ค.
- activeConnections:
- ์ค๋ช
: ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌ ์ค์ธ ์ปค๋ฅ์
์ ์์
๋๋ค. ๋์ ์์ฒญ์ด 10๊ฑด ๋ฐ์ํ๋ฉด
activeConnections
๋ 10์ด ๋ฉ๋๋ค. ๋ ์ด์ ์ฌ์ ๊ฐ ์๋ ์ํ์์ ์ถ๊ฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋๊ธฐ ์ํ๊ฐ ๋ฉ๋๋ค. - ์ด๋ฏธ์ง ์ค๋ช
: ์ฒซ ๋ฒ์งธ ๊ทธ๋ฆผ์์
activeConnections = 1
๋ก, ํ ๊ฐ์ ์์ฒญ์ด ํ์ฑํ๋ ์ํ์ ๋๋ค. ๋ ๋ฒ์งธ ๊ทธ๋ฆผ์์๋activeConnections = 5
๋ก, 5๋ช ์ด ๋์์ ์์ฒญ์ ๋ณด๋ด๊ณ ์์ต๋๋ค. ์ธ ๋ฒ์งธ ๊ทธ๋ฆผ์์๋activeConnections = 10
์ผ๋ก, ๋ชจ๋ ์ปค๋ฅ์ ์ด ํ์ฑํ๋์ด ์ถ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ํ์ ๋๋ค.
- ์ค๋ช
: ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌ ์ค์ธ ์ปค๋ฅ์
์ ์์
๋๋ค. ๋์ ์์ฒญ์ด 10๊ฑด ๋ฐ์ํ๋ฉด
- idleConnections:
- ์ค๋ช
: ์ ํด ์ํ๋ก ๋๊ธฐ ์ค์ธ ์ปค๋ฅ์
์ ์๋ฅผ ๋ํ๋
๋๋ค. ์๋ฅผ ๋ค์ด, ์ฒซ ๋ฒ์งธ ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋
idleConnections
๋ 9๊ฐ์ด๋ฉฐ, ๋ชจ๋ ์ปค๋ฅ์ ์ด ํ์ฑํ๋๋ฉดidleConnections
๋ 0์ด ๋ฉ๋๋ค. - ์ด๋ฏธ์ง ์ค๋ช
: ์ฒซ ๋ฒ์งธ ๊ทธ๋ฆผ์์
idleConnections = 9
๋ก, 9๊ฐ์ ์ปค๋ฅ์ ์ด ๋๊ธฐ ์ํ์ ๋๋ค. ๋ ๋ฒ์งธ ๊ทธ๋ฆผ์์๋idleConnections = 5
, ์ธ ๋ฒ์งธ ๊ทธ๋ฆผ์์๋idleConnections = 0
์ผ๋ก, ๋ชจ๋ ์ปค๋ฅ์ ์ด ์ฌ์ฉ ์ค์ธ ์ํ์ ๋๋ค.
- ์ค๋ช
: ์ ํด ์ํ๋ก ๋๊ธฐ ์ค์ธ ์ปค๋ฅ์
์ ์๋ฅผ ๋ํ๋
๋๋ค. ์๋ฅผ ๋ค์ด, ์ฒซ ๋ฒ์งธ ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋
- totalConnections:
- ์ค๋ช
: ์ปค๋ฅ์
ํ์์ ๊ด๋ฆฌํ๊ณ ์๋ ์ด ์ปค๋ฅ์
์๋ก,
activeConnections
์idleConnections
์ ํฉ์ ๋๋ค. ์ด ๊ฐ์maximumPoolSize
๋ด์์ ์ ์ง๋๋ฉฐ, ๋์ ์์ฒญ์ด ๋ง์์๋กidleConnections
๊ฐ ์ค์ด๋ญ๋๋ค. - ์ด๋ฏธ์ง ์ค๋ช
: ์ธ ๊ฐ์ ๊ทธ๋ฆผ ๋ชจ๋
totalConnections = 10
์ผ๋ก, ์ด๋ ์ปค๋ฅ์ ํ์์ ๊ด๋ฆฌํ๋ ์ปค๋ฅ์ ์ด ์ด 10๊ฐ์์ ๋ํ๋ ๋๋ค.
- ์ค๋ช
: ์ปค๋ฅ์
ํ์์ ๊ด๋ฆฌํ๊ณ ์๋ ์ด ์ปค๋ฅ์
์๋ก,
- threadsAwaitingConnection:
- ์ค๋ช
: ์ปค๋ฅ์
์ด ๋ชจ๋ ์ฌ์ฉ ์ค์ผ ๋ ๋๊ธฐ ์ค์ธ ์์ฒญ์ ์๋ฅผ ๋ํ๋
๋๋ค. ์๋ฅผ ๋ค์ด, 10๋ช
์ ์ฌ์ฉ์๊ฐ ๋ชจ๋ ์ปค๋ฅ์
์ ์ฌ์ฉ ์ค์ผ ๋ ์ถ๊ฐ ์์ฒญ์ด ๋ฐ์ํ๋ฉด, ๊ทธ ์์ฒญ์ ๋๊ธฐ ์ํ๋ก ๋ค์ด๊ฐ
threadsAwaitingConnection
์ด ์ฆ๊ฐํฉ๋๋ค. - ์ด๋ฏธ์ง ์ค๋ช : ๋ง์ง๋ง ๊ทธ๋ฆผ์์๋ ๋ชจ๋ ์ปค๋ฅ์ ์ด ์ฌ์ฉ ์ค์ด๊ธฐ ๋๋ฌธ์, ์ถ๊ฐ ์์ฒญ์ด ๋ฐ์ํ๋ฉด ๋๊ธฐ ์ํ๋ก ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
- ์ค๋ช
: ์ปค๋ฅ์
์ด ๋ชจ๋ ์ฌ์ฉ ์ค์ผ ๋ ๋๊ธฐ ์ค์ธ ์์ฒญ์ ์๋ฅผ ๋ํ๋
๋๋ค. ์๋ฅผ ๋ค์ด, 10๋ช
์ ์ฌ์ฉ์๊ฐ ๋ชจ๋ ์ปค๋ฅ์
์ ์ฌ์ฉ ์ค์ผ ๋ ์ถ๊ฐ ์์ฒญ์ด ๋ฐ์ํ๋ฉด, ๊ทธ ์์ฒญ์ ๋๊ธฐ ์ํ๋ก ๋ค์ด๊ฐ
- connectionTimeout:
- ์ค๋ช
: ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ์ปค๋ฅ์
์ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆด ์ ์๋ ์ต๋ ์๊ฐ์ ๋ํ๋
๋๋ค. ์๋ฅผ ๋ค์ด,
connectionTimeout
์ด 2์ด๋ก ์ค์ ๋ ๊ฒฝ์ฐ, ๋๊ธฐ ์ค์ธ ์์ฒญ์ด 2์ด ๋ด์ ์ปค๋ฅ์ ์ ํ ๋น๋ฐ์ง ๋ชปํ๋ฉด ์์ฒญ์ ์คํจํ๊ฒ ๋ฉ๋๋ค. - ์ด๋ฏธ์ง ์ค๋ช
: ๋ง์ง๋ง ๊ทธ๋ฆผ์์ ๋ชจ๋ ์ปค๋ฅ์
์ด ์ฌ์ฉ ์ค์ธ ์ํ์์ ์ถ๊ฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด,
connectionTimeout
๋ด์ ์ปค๋ฅ์ ์ ํ ๋น๋ฐ์ง ๋ชปํ ๊ฒฝ์ฐ ํด๋น ์์ฒญ์ ์คํจํ๊ฒ ๋ฉ๋๋ค.
- ์ค๋ช
: ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ์ปค๋ฅ์
์ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆด ์ ์๋ ์ต๋ ์๊ฐ์ ๋ํ๋
๋๋ค. ์๋ฅผ ๋ค์ด,
- validationTimeout:
- ์ค๋ช : ํ์์ ์ปค๋ฅ์ ์ ๋น๋ ค์ฌ ๋ ํด๋น ์ปค๋ฅ์ ์ด ์ ํจํ์ง ํ์ธํ๋ ์๊ฐ์ ๋๋ค. ์ด ์๊ฐ์ด ์ด๊ณผ๋๋ฉด ํด๋น ์ปค๋ฅ์ ์ ์ฌ์ฉ๋์ง ์๊ณ ์๋ก์ด ์ปค๋ฅ์ ์ด ํ ๋น๋ฉ๋๋ค.
- ์ด๋ฏธ์ง ์ค๋ช : ์ ํด ์ํ๋ก ์ค๋ ์๋ ์ปค๋ฅ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ์์ ์คํจํ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ ์๋ก์ด ์ปค๋ฅ์ ์ด ํ ๋น๋ฉ๋๋ค. ์ด๋ฏธ์ง์์๋ ์ ํด ์ํ์ ์ปค๋ฅ์ ๋ค์ด ๋๊ธฐ ์ค์ธ ์ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์์ HikariCP๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. HikariCP๋ Spring Boot์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ปค๋ฅ์ ํ๋ก, ์ค์ ์ ํตํด ๋ค์ํ ์ปค๋ฅ์ ๊ด๋ฆฌ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ๋ํ, HikariCP์ ์ํ๋ฅผ ์ธก์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ถ๊ฐํ์ฌ ์ปค๋ฅ์ ํ์ ํจ์จ์ ์ธ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
spring:
datasource:
hikari:
maximum-pool-size: 10 # ์ต๋ ์ปค๋ฅ์
์
minimum-idle: 10 # ์ต์ ์ ํด ์ปค๋ฅ์
์
connection-timeout: 30000 # ์ปค๋ฅ์
์ ๊ฐ์ ธ์ฌ ๋ ๋๊ธฐํ ์ต๋ ์๊ฐ (๋ฐ๋ฆฌ์ด)
max-lifetime: 1800000 # ์ปค๋ฅ์
์ด ์ ์ง๋ ์ต๋ ์๊ฐ (๋ฐ๋ฆฌ์ด)
idle-timeout: 600000 # ์ ํด ์ปค๋ฅ์
์ด ์ ์ง๋ ์ต๋ ์๊ฐ (๋ฐ๋ฆฌ์ด)
leak-detection-threshold: 2000 # ์ปค๋ฅ์
๋ฆฌํฌ๋ฅผ ๊ฐ์งํ ๊ธฐ์ค ์๊ฐ (๋ฐ๋ฆฌ์ด)
pool-name: Sample-HikariPool # ์ปค๋ฅ์
ํ ์ด๋ฆ
auto-commit: true # ์๋ ์ปค๋ฐ ์ฌ๋ถ
validation-timeout: 5000 # ์ปค๋ฅ์
์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํ ์ต๋ ์๊ฐ (๋ฐ๋ฆฌ์ด)
read-only: false # ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋ ์ฌ๋ถ
isolate-internal-queries: false # ๋ด๋ถ ์ฟผ๋ฆฌ ๊ฒฉ๋ฆฌ ์ฌ๋ถ
allow-pool-suspension: false # ์ปค๋ฅ์
ํ ์ผ์ ์ ์ง ํ์ฉ ์ฌ๋ถ
initialization-fail-timeout: 1 # ์ด๊ธฐํ ์คํจ ์ ํ์์์ (๋ฐ๋ฆฌ์ด)
@Service
class SampleService(
private val dataSource: DataSource,
private val memberRepository: MemberRepository
) {
private val log = LoggerFactory.getLogger(javaClass)!!
@Transactional
fun getMember(): Member {
val member = memberRepository.findById(Random.nextInt(1, 101).toLong()).get()
runBlocking { delay(1000) }
val targetDataSource = dataSource.unwrap(HikariDataSource::class.java)
val hikariDataSource = targetDataSource as HikariDataSource
val hikariPoolMXBean = hikariDataSource.hikariPoolMXBean
val hikariConfigMXBean = hikariDataSource.hikariConfigMXBean
val log =
"""
totalConnections : ${hikariPoolMXBean.totalConnections}
activeConnections : ${hikariPoolMXBean.activeConnections}
idleConnections : ${hikariPoolMXBean.idleConnections}
threadsAwaitingConnection : ${hikariPoolMXBean.threadsAwaitingConnection}
""".trimIndent()
this.log.info(log)
return member
}
}
์ด ์ฝ๋์์๋ ๋จผ์ DataSource
๋ฅผ HikariDataSource
๋ก ๋ณํํ ํ, HikariPoolMXBean
๊ณผ HikariConfigMXBean
์ ์ฌ์ฉํ์ฌ ์ปค๋ฅ์
ํ์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ด ์ปค๋ฅ์
์, ํ์ฑ ์ปค๋ฅ์
์, ์ ํด ์ปค๋ฅ์
์, ๊ทธ๋ฆฌ๊ณ ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ์์ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๋ํ, runBlocking { delay(1000) }
์ ์ฌ์ฉํ์ฌ 1์ด๊ฐ์ ์ง์ฐ์ ์ถ๊ฐํจ์ผ๋ก์จ, ์ค์ ์์ฒญ์ด ์ฒ๋ฆฌ๋๋ ๋์ ์ปค๋ฅ์
ํ์ ์ํ๋ฅผ ๋ณด๋ค ๋ช
ํํ๊ฒ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก, ์ด๋ฌํ ์ปค๋ฅ์
ํ์ ์ํ๋ฅผ ๋ก๊ทธ๋ก ์ถ๋ ฅํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์กฐ์ ํ ์ ์๋ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ ์ปค๋ฅ์ ํ์ ์ฌ์ฉํ ๋, ์ปค๋ฅ์ ํ์ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋์ ๊ฐ์ ๋ก๊ทธ๋ **10 TPS (์ด๋น ํธ๋์ญ์ )**๋ฅผ ์ง์์ ์ผ๋ก ์ ์งํ ๋ ๋ฐ์ํ ๋ก๊ทธ์ ๋๋ค. ์ด๋ ํ๊ท ์๋ต ์๊ฐ์ ์ฝ 1,000ms๋ก ๋ํ๋๋ฉฐ, ์ด๋ TPS ์์ค์ ๊ณ ๋ คํ์ ๋ ์์คํ ์ด ์ ์ ์์ค์์ ์๋ํ๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค.
-
๋ก๊ทธ 1:
totalConnections = 10
activeConnections = 7
idleConnections = 3
threadsAwaitingConnection = 0
์ด ์ํ๋ ์ด 10๊ฐ์ ์ปค๋ฅ์ ์ค 7๊ฐ๊ฐ ํ์ฑํ๋์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์ผ๋ฉฐ, 3๊ฐ์ ์ ํด ์ปค๋ฅ์ ์ด ๋๊ธฐ ์ค์ธ ์ํฉ์ ๋๋ค. ๋ชจ๋ ์์ฒญ์ด ์ํํ๊ฒ ์ฒ๋ฆฌ๋๊ณ ์๊ธฐ ๋๋ฌธ์, ๋๊ธฐ ์ค์ธ ์ค๋ ๋๋ ์์ต๋๋ค.
-
๋ก๊ทธ 2:
totalConnections = 10
activeConnections = 10
idleConnections = 0
threadsAwaitingConnection = 4
์ด ์ํ๋ ๋ชจ๋ 10๊ฐ์ ์ปค๋ฅ์ ์ด ํ์ฑํ๋์ด ์์ฒญ์ ์ฒ๋ฆฌ ์ค์ด๋ฉฐ, ๋ ์ด์ ์ ํด ์ปค๋ฅ์ ์ด ๋จ์์์ง ์์ต๋๋ค. ์ด๋ 4๊ฐ์ ์ถ๊ฐ ์์ฒญ์ด ๋ค์ด์ ๋๊ธฐ ์ค์ ๋๋ค.
threadsAwaitingConnection
๊ฐ์ด 4๋ก ์ฆ๊ฐํ ์ด์ ๋, ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ ํด ์ปค๋ฅ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ปค๋ฅ์
ํ์ด ์ค์ ๋ maximumPoolSize
๋งํผ ํ์ฑํ๋ ๊ฒฝ์ฐ, ๊ทธ ์ดํ์ ๋ค์ด์ค๋ ์์ฒญ์ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋๊ธฐ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ๋๊ธฐ ์๊ฐ์ด ๋๋ฌด ๊ธธ์ด์ง๋ฉด ํ์์์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ํ์์์์ด ๋ฐ์ํ๋ ์ฃผ์ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
connection-timeout์ ์ปค๋ฅ์
์ ์ป๊ธฐ ์ํด ์ค๋ ๋๊ฐ ๋๊ธฐํ ์ ์๋ ์ต๋ ์๊ฐ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, connection-timeout
์ด 30์ด๋ก ์ค์ ๋์ด ์๋ค๋ฉด, ์ปค๋ฅ์
ํ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ์ปค๋ฅ์
์ 30์ด ๋์ ์ ๊ณตํ์ง ๋ชปํ ๊ฒฝ์ฐ ํ์์์์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ด ์ค์ ์ ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ์ผ๋ง ๋์ ๊ธฐ๋ค๋ฆด ์ ์๋์ง๋ฅผ ์ ํํฉ๋๋ค.
์ปค๋ฅ์
ํ์ ํ์ ๋ ์์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ์์คํ
์ ์์ ์ฑ์ ์ ์งํ๋ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค. ๊ทธ๋ฌ๋, ๋ง์ฝ ์์ฒญ๋์ด ์ค์ ๋ maximumPoolSize
๋ฅผ ์ด๊ณผํ๊ฒ ๋๋ฉด ๋๊ธฐ ์ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํ ํ์์์ ๊ฐ์ ์ค์ ํ๊ณ , ํ์์ ๋ฐ๋ผ ํ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
spring:
datasource:
hikari:
maximum-pool-size: 10 # ์ต๋ ์ปค๋ฅ์
์
minimum-idle: 10 # ์ต์ ์ ํด ์ปค๋ฅ์
์
connection-timeout: 250 # ์ปค๋ฅ์
์ ๊ฐ์ ธ์ฌ ๋ ๋๊ธฐํ ์ต๋ ์๊ฐ (๋ฐ๋ฆฌ์ด)
์ ์ค์ ์์ connection-timeout
์ 250ms๋ก ์ง์ ํ ๊ฒฝ์ฐ, TPS๊ฐ 10์ ์ด๊ณผํ๊ฒ ๋๋ฉด threadsAwaitingConnection์ ๋๊ธฐํ๋ ์๊ฐ์ด 250ms๋ฅผ ๋์ ์ ์์ต๋๋ค. ์ด ์ํฉ์ด ๋ฐ์ํ๋ฉด, ์ปค๋ฅ์
ํ์ ์ค์ ๋ ๋๊ธฐ ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฏธ์ง์์์ ๊ฐ์ด, RPS
(Request Per Second)๊ฐ 10 ์ด์์ผ ๋ ์ปค๋ฅ์
ํ์ ํ๊ณ๋ก ์ธํด ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ๋ฐ์ํ๊ณ , ๊ทธ ๋๊ธฐ ์๊ฐ์ด 250ms
๋ฅผ ์ด๊ณผํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ Failures/s
๊ฐ ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ํ์์์ ์ค์ ๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ, ์ปค๋ฅ์
ํ์ ์์ ํ๊ณ์ ์ฒ๋ฆฌ๋์ ์ ์ ํ ๋ง์ถฐ์ผ ํ๋ ์ด์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ค๋ฅ ๋ฉ์์ง ์์:
java.sql.SQLTransientConnectionException: Sample-HikariPool - Connection is not available, request timed out after 251ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:696) ~[HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:197)
์ด ์ค๋ฅ๋ ๋๊ธฐ ์๊ฐ์ด ์ค์ ๋ connection-timeout
์ ์ด๊ณผํ์์ ์๋ฏธํ๋ฉฐ, ์ปค๋ฅ์
ํ์ด ์ถ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ๋ํ๋
๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ Connection Pool์ ์์ ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ํ์ง๋ง ์์คํ ๋ถํ๊ฐ ๋๊ฑฐ๋ ์ค์ ์ด ์ ์ ํ์ง ์์ ๊ฒฝ์ฐ, ์ปค๋ฅ์ ํ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก ์ธํด ์ฑ๋ฅ ์ ํ๋ ํ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ํต์ฌ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ ์ ์์ต๋๋ค.
- ์ฟผ๋ฆฌ ์ต์ ํ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ๋ฌธ์ ๋ ์ข ์ข ๋นํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ์ฟผ๋ฆฌ ์ต์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต ์๊ฐ์ ์ค์ด๊ณ , ์ปค๋ฅ์ ์ด ์ค๋ซ๋์ ์ ์ ๋๋ ์ํฉ์ ๋ฐฉ์งํ ์ ์๋ ์ค์ํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณต์กํ ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๋ ๊ฒ ๋ฑ์ด ์ด์ ํด๋นํฉ๋๋ค.
- connection-timeout ์๊ฐ ์กฐ์ : ์ปค๋ฅ์ ํ์์์์ ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ์ปค๋ฅ์ ์ ์ป๊ธฐ ์ํด ์ผ๋ง๋ ์ค๋ ์๊ฐ ๊ธฐ๋ค๋ฆด ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด ์๊ฐ์ ์ ์ ํ ์ค์ ํจ์ผ๋ก์จ ๋๊ธฐ ์ค์ธ ์์ฒญ๋ค์ด ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ํ ์ ์์ต๋๋ค. ๋๋ฌด ์งง์ ํ์์์์ ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ ์๊ณ , ๋๋ฌด ๊ธด ํ์์์์ ์๋ต ์ง์ฐ์ ์ด๋ํ ์ ์์ผ๋ฏ๋ก, ์ํฉ์ ๋ง๊ฒ ํ์์์์ ์กฐ์ ํด์ผ ํฉ๋๋ค.
- maximum-pool-size ์ฆ๊ฐ: ์์๋๋ ํธ๋ํฝ์ ๋ง์ถฐ ์ปค๋ฅ์ ํ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ๋๋ฆผ์ผ๋ก์จ ๋์ ์์ฒญ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์์คํ ์ ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ฉ๋์ ์ ์คํ๊ฒ ๊ณ ๋ คํ์ฌ ์ต์ ์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ด์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ ์ ํ ์ ์ฉํ๋ฉด Connection Pool ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์๋์์๋ ์ด ์ธ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ค๋ฃจ๊ณ , ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ํตํด ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ฟผ๋ฆฌ ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ํฅ์์ ์์ด ์ค์ํ ๋จ๊ณ์
๋๋ค. ํนํ, ์ ํ๋ฆฌ์ผ์ด์
์์ activeConnections
๊ฐ ๋น ๋ฅด๊ฒ ์๋ตํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ, ๊ทธ ์์ธ์ด ๋ณต์กํ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ์ ์๋ค๋ฉด ์ฟผ๋ฆฌ ์ต์ ํ๋ฅผ ํตํด ์ฑ๋ฅ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์๋ชป ์ค๊ณ๋ ์ฟผ๋ฆฌ๋ ๋ถํ์ํ๊ฒ ๊ธด ์คํ ์๊ฐ์ ๊ฐ์ง ์ฟผ๋ฆฌ๋ ์์คํ
์ ๋ฐ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๊ณ , ์ปค๋ฅ์
ํ์ ์์์ ์ค๋ ์ ์ ํ๊ฒ ๋์ด ๋๊ธฐ ์ค์ธ ์์ฒญ๋ค์ด ์ง์ฐ๋๋ ์ํฉ์ ์ด๋ํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํจ์ผ๋ก์จ ์๋ต ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค:
@Transactional
fun getMember(): Member {
val member = memberRepository.findById(Random.nextInt(1, 101).toLong()).get()
// runBlocking { delay(1000) } ๋ธ๋กํน ์ฝ๋ ์ ๊ฑฐ
...
return member
}
์ ์ฝ๋์์ ๋ถํ์ํ ๋ธ๋กํน ์ฝ๋์ธ runBlocking { delay(1000) }
๋ฅผ ์ ๊ฑฐํจ์ผ๋ก์จ ์ฟผ๋ฆฌ ์คํ ์ง์ฐ์ ์์ด์ต๋๋ค. ์ด์ ๊ฐ์ด, ์ฟผ๋ฆฌ ์ต์ ํ๋ ๋จ์ํ ์ฝ๋ ๋ด์ ๋ธ๋กํน ์์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, ์ธ๋ฑ์ค ์ถ๊ฐ, ๋ณต์กํ ์กฐ์ธ ๊ตฌ์กฐ ๋จ์ํ, ์บ์ฑ ๋ฑ์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ถํ๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ๋ ํฌํจ๋ฉ๋๋ค. ์ด๋ฌํ ์ต์ ํ ์์
์ ํตํด ์ฟผ๋ฆฌ ์คํ ์๊ฐ์ด ์ค์ด๋ค๋ฉด ์ปค๋ฅ์
์ด ๋ ๋นจ๋ฆฌ ๋ฐํ๋๊ณ , ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ ์ต์ ํ๋ฅผ ํตํด ์ฑ๋ฅ์ด ํฅ์๋๋ฉด, connection-timeout์ด 250ms๋ก ์ค์ ๋ ์ํฉ์์๋ RPS๊ฐ 20์ธ ๊ฒฝ์ฐ์ฒ๋ผ ๋์ ์์ฒญ ์ฒ๋ฆฌ๋์์๋ ํ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ฟผ๋ฆฌ๊ฐ ์ต์ ํ๋๋ฉด ์ปค๋ฅ์ ์ด ๋ ๋น ๋ฅด๊ฒ ๋ฐํ๋๊ธฐ ๋๋ฌธ์, ์ปค๋ฅ์ ํ ๋ด์์ ๋ ๋ง์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ต์ ํ๋ ์ฟผ๋ฆฌ๋ ์ปค๋ฅ์ ์ ์ ์๊ฐ์ ์ค์ฌ connection-timeout ์ค์ ์ ์ ํ์ ๋์ง ์๋๋ก ๋์์ฃผ๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๋ง์ ํธ๋์ญ์ ์ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์, ์ฟผ๋ฆฌ ์ต์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ ์งํ๊ณ ํฅ์์ํค๋ ์ค์ํ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์ฟผ๋ฆฌ ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ๊ฐ์ ๋ฟ๋ง ์๋๋ผ, ์ปค๋ฅ์ ํ ์์ ๊ด๋ฆฌ์๋ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋ถํ์ํ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ , ์์คํ ์ด ๊ณ ๋ถํ ์ํฉ์์๋ ์ํํ๊ฒ ์๋ํ ์ ์๋๋ก ๋์ต๋๋ค.
connection-timeout
์ค์ ์ ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ์ปค๋ฅ์
์ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆด ์ ์๋ ์๊ฐ์ ์กฐ์ ํ๋ ์ค์ํ ์์์
๋๋ค. ๋ง์ฝ ์์ฒญ๋์ด ๋ง์ maximumPoolSize์ ๋๋ฌํ์ ๋, connection-timeout
์ ์ ์ ํ ๋๋ ค์ฃผ๋ฉด ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ์ปค๋ฅ์
์ ํ ๋น๋ฐ๊ธฐ๊น์ง ๋ ์ค๋ ์๊ฐ์ ํ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, connection-timeout
์ 250ms์์ 2,500ms๋ก ๋๋ฆฌ๋ฉด, ์ปค๋ฅ์
๋ฐํ ๋๊ธฐ ์๊ฐ์ ๋ ๊ธธ๊ฒ ์ค์ ํจ์ผ๋ก์จ ํ์์์ ์ค๋ฅ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ํ์ง๋ง, ๋๋ฌด ๊ธด ๋๊ธฐ ์๊ฐ์ ์ค์ ํ๋ฉด ๊ทธ๋งํผ ์๋ต ์๊ฐ์ด ์ง์ฐ๋ ์ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค.
์๋๋ connection-timeout
์ 2,500ms๋ก ์ค์ ํ๊ณ ํ
์คํธํ ์ค์ ์์์
๋๋ค:
spring:
datasource:
hikari:
maximum-pool-size: 10 # ์ต๋ ์ปค๋ฅ์
์
minimum-idle: 10 # ์ต์ ์ ํด ์ปค๋ฅ์
์
connection-timeout: 2500 # ์ปค๋ฅ์
์ ๊ฐ์ ธ์ฌ ๋ ๋๊ธฐํ ์ต๋ ์๊ฐ (๋ฐ๋ฆฌ์ด)
์ด ์ค์ ์์, delay(1000)
๋ ์ ์งํ๋ฉด์ connection-timeout
์ 2,500ms๋ก ๋ณ๊ฒฝํ ํ ํ
์คํธ๋ฅผ ์งํํ์์ต๋๋ค.
ํ ์คํธ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค:
totalConnections : 10
maximumPoolSize : 10
activeConnections : 10
idleConnections : 0
threadsAwaitingConnection : 20
- totalConnections: 10๊ฐ ์ปค๋ฅ์ ์ด ๋ชจ๋ ์ฌ์ฉ ์ค์ ๋๋ค.
- maximumPoolSize: ์ค์ ๋ ์ต๋ ์ปค๋ฅ์ ์๋ 10๊ฐ์ ๋๋ค.
- activeConnections: ํ์ฌ 10๊ฐ์ ์ปค๋ฅ์ ์ด ํ์ฑํ๋์ด ์์ต๋๋ค.
- idleConnections: ์ ํด ์ปค๋ฅ์ ์ด ์์ผ๋ฉฐ, ๋ชจ๋ ์ปค๋ฅ์ ์ด ์ฌ์ฉ ์ค์ ๋๋ค.
- threadsAwaitingConnection: 20๊ฐ์ ์์ฒญ์ด ๋๊ธฐ ์ค์ ๋๋ค.
connection-timeout ์ค์ ์ด 2,500ms๋ก ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ, threadsAwaitingConnection์์ ๋๊ธฐํ๋ ์๊ฐ์ด ๊ธธ์ด์ก์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํ์์์ ์ค๋ฅ๋ ๋ฐ์ํ์ง ์์์ง๋ง, ์๋ต ์๊ฐ์ด ๋ ๊ธธ์ด์ก์ต๋๋ค. ์ด๋ ๊ฐ ์์ฒญ์ ๋ํด delay(1000)
์ผ๋ก ์ธํ 1,000ms์ ๋ธ๋กํน ์๊ฐ๊ณผ threadsAwaitingConnection์์ ๋๊ธฐํ ์๊ฐ์ด ํฉ์ณ์ ธ ์๋ต ์๊ฐ์ด ๋๋ ค์ง ๊ฒ์
๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ, ํ์์์์ ๊ธธ๊ฒ ์ค์ ํ๋ ๊ฒ์ ํ์์์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์์ง๋ง, ๋์์ ์๋ต ์๋๊ฐ ์ ํ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, connection-timeout์ ์์ฒญ์ ํน์ฑ๊ณผ ํธ๋ํฝ ํจํด์ ๋ง์ถ์ด ์ ์ ํ ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์์ ์ฒ๋ฆฌํ ์ ์๋ ๋์ ์์ฒญ ์๊ฐ ๋ง์์ง ๊ฒ์ผ๋ก ์์๋๋ค๋ฉด, maximum-pool-size
๋ฅผ ๋๋ ค ์ปค๋ฅ์
ํ์์ ๋ ๋ง์ ์ปค๋ฅ์
์ ์์ฑํ๊ณ ์ ์งํ ์ ์๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํธ๋ํฝ์ด ์์๋ณด๋ค ๋ง์์ง๊ฑฐ๋, ๋์์ฑ ์ฒ๋ฆฌ๊ฐ ๋ง์ด ์๊ตฌ๋๋ ์ํฉ์์๋ ์ปค๋ฅ์
ํ ํฌ๊ธฐ๋ฅผ ๋๋ ค์ฃผ๋ ๊ฒ์ด ์ ๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋ง์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋, ๋ฌด์์ ํ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ ํ๋ ๊ฒ์ ์์ ๋ญ๋น๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ์ปค๋ฅ์
ํ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ์ CPU๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์, ์์คํ
์ ์์ ์ฌ์ฉ๋์ ์ ์คํ ๊ณ ๋ คํ ํ์ ์กฐ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, maximum-pool-size
๋ฅผ 100์ผ๋ก ์ค์ ํ๊ณ , 1,000ms ๋๊ธฐ ์ฝ๋๋ฅผ ๋ค์ ํ์ฑํ์ํค๋ฉฐ connection-timeout
์ 250ms๋ก ์ ์งํ์์๋ ๋ถ๊ตฌํ๊ณ , ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ์ํฉ์ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
@Transactional
fun getMember(): Member {
val member = memberRepository.findById(Random.nextInt(1, 101).toLong()).get()
runBlocking { delay(1000) } // 1,000ms ๋๊ธฐ
...
return member
}
์ด ์ฝ๋์์๋ runBlocking { delay(1000) }
๋ฅผ ํตํด ๊ฐ ์์ฒญ๋ง๋ค 1์ด์ ์ง์ฐ์ ๋ฐ์์ํค๊ณ ์์ง๋ง, maximum-pool-size
๋ฅผ ์ถฉ๋ถํ ๋๊ฒ ์ค์ ํจ์ผ๋ก์จ ๋์ ์์ฒญ์ด ๋ชฐ๋ฆฌ๋ ์ํฉ์์๋ ํ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ์๋์ ๊ฐ์ ๋ก๊ทธ๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
totalConnections : 30
maximumPoolSize : 100
activeConnections : 13
idleConnections : 17
- totalConnections: ํ์ฌ ์ปค๋ฅ์ ํ์์ ๊ด๋ฆฌ๋๊ณ ์๋ ์ปค๋ฅ์ ์ ์ด ๊ฐ์๋ก, ํ์ฌ 30๊ฐ๊ฐ ํ ๋น๋์ด ์๋ ์ํ์ ๋๋ค.
- maximumPoolSize: ์ปค๋ฅ์ ํ์์ ์ค์ ๋ ์ต๋ ์ปค๋ฅ์ ์๋ 100์ ๋๋ค. ํ์ง๋ง, ๋ชจ๋ ์ปค๋ฅ์ ์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ 100๊น์ง ์ฐจ์ง ์๊ณ ์๋ ์ํฉ์ ๋๋ค.
- activeConnections: ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌ ์ค์ธ ํ์ฑ ์ปค๋ฅ์ ์๋ 13๊ฐ์ ๋๋ค.
- idleConnections: ์ ํด ์ํ๋ก ๋๊ธฐ ์ค์ธ ์ปค๋ฅ์ ์๋ 17๊ฐ๋ก, ์์ฒญ์ด ์ถ๊ฐ๋ก ๋ค์ด์ค๋ฉด ์ด ์ปค๋ฅ์ ๋ค์ด ํ์ฑํ๋ ์ ์์ต๋๋ค.
์ด ์ํฉ์์๋ maximumPoolSize๊ฐ 100์ผ๋ก ์ค์ ๋์ด ์์ง๋ง, ๋ชจ๋ ์ปค๋ฅ์
์ด ์ฌ์ฉ ์ค์ด์ง ์๊ธฐ ๋๋ฌธ์ ์์ ๋ญ๋น๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค. ์์ฒญ์ด ๋ชฐ๋ฆฌ์ง ์๋ ์ํ์์๋ activeConnections
๊ฐ 13๊ฐ์ ๋จธ๋ฌด๋ฅด๊ณ , ๋๋จธ์ง 17๊ฐ๋ ์ ํด ์ํ๋ก ๋จ์์์ต๋๋ค. ์ด์ฒ๋ผ ์ต๋ ์ปค๋ฅ์
์๋ ์ค์ ํ์ง๋ง, ํ์ํ ๋๋ง ์ปค๋ฅ์
์ด ํ์ฑํ๋๊ณ ๋๋จธ์ง๋ ์ ํด ์ํ๋ฅผ ์ ์งํ๋ ๋ฐฉ์์ผ๋ก ํจ์จ์ ์ธ ์์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ฐ๋ผ์, maximum-pool-size
๋ ํธ๋ํฝ์ด ๋ชฐ๋ฆด ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ์ถฉ๋ถํ ํฐ ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ง๋ง, ์์คํ
์์์ ๋ถ๋ด์ ์ฃผ์ง ์๋๋ก ์ค์ ํธ๋ํฝ๊ณผ ์์ ์ฌ์ฉ๋์ ๋ถ์ํ์ฌ ์ ์ ํ ๊ฐ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
HikariCP๋ฅผ ์ฌ์ฉํ MySQL ์ปค๋ฅ์ ํ ๊ด๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ ์์์ ๋๋ค. ์ ์ ํ ์ปค๋ฅ์ ํ ์ค์ ์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ๋ถํ์ํ ์ฐ๊ฒฐ ์ฌ์์ฑ์ ํผํ๋ฉฐ, ์๋ต ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋, maximumPoolSize์ connection-timeout๊ณผ ๊ฐ์ ์ค์ ์ด ์ ์ ํ์ง ์์ผ๋ฉด, ํธ๋ํฝ์ด ์ฆ๊ฐํ ๋ ์ปค๋ฅ์ ํ์์ ๋๊ธฐ ์๊ฐ์ด ๋์ด๋๊ฑฐ๋ ํ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์์คํ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ค์ํ ํฌ์ธํธ๋ฅผ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
- ์ฟผ๋ฆฌ ์ต์ ํ: ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ด ๋๋ฆด ๊ฒฝ์ฐ
activeConnections
๊ฐ ๋ถํ์ํ๊ฒ ์ค๋ ์ ์ ๋๋ฉฐ, ์ ์ฒด ์์คํ ์ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ์ฌ ์ปค๋ฅ์ ์ ๋น ๋ฅด๊ฒ ๋ฐํํ๋ฉด ๋๊ธฐ ์ค์ธ ์์ฒญ๋ ์ ์ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. - maximum-pool-size ์ค์ : maximum-pool-size๋ ๋์ ์ฒ๋ฆฌํ ์ ์๋ ์ต๋ ์์ฒญ ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ํธ๋ํฝ ์์ธก์ ๋ง์ถฐ ์ ์ ํ ํ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ ์ค์ํ์ง๋ง, ์์ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋๋ฌด ํฌ๊ฒ ์ค์ ํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ค์ ๋ก ํ์ํ ๋๋ง ์ปค๋ฅ์ ์ด ํ์ฑํ๋๋ ๋ฐฉ์์ผ๋ก ์์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- connection-timeout ์ค์ : connection-timeout ๊ฐ์ ๋๊ธฐ ์ค์ธ ์์ฒญ์ด ์ปค๋ฅ์ ์ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆด ์ ์๋ ์ต๋ ์๊ฐ์ ๊ฒฐ์ ํฉ๋๋ค. ์ด ๊ฐ์ ๋๋ฌด ๋ฎ๊ฒ ์ค์ ํ๋ฉด ํธ๋ํฝ์ด ๋ชฐ๋ฆด ๋ ํ์์์ ์ค๋ฅ๊ฐ ์์ฃผ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ๋ฐ๋๋ก ๋๋ฌด ๊ธธ๊ฒ ์ค์ ํ๋ฉด ์๋ต ์๊ฐ์ด ์ง์ฐ๋ ์ ์์ต๋๋ค. ํธ๋ํฝ ํจํด์ ๋ง์ถฐ ์ ์ ํ ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- TPS ๋ชจ๋ํฐ๋ง: ์ด๋น ์ฒ๋ฆฌ๋(TPS)์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ํธ๋ํฝ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก HikariCP ์ค์ ์ ์กฐ์ ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ํ ๋ถํ ์ํฉ์์๋ ์ํํ๊ฒ ์๋ํ ์ ์๋๋ก ํฉ๋๋ค.
์ต์ข ์ ์ผ๋ก, ์ปค๋ฅ์ ํ ์ค์ ์ ์กฐ์ ํ ๋๋ ํธ๋ํฝ ํจํด๊ณผ ์์คํ ์์์ ๊ณ ๋ คํ์ฌ ์ต์ ํ๋ ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ์๋ต ์๋ ์ง์ฐ ๋ฐ ํ์์์ ์ค๋ฅ๋ฅผ ์ต์ํํ ์ ์์ผ๋ฉฐ, ์์ ์ ์ธ ์์คํ ์ด์๊ณผ ํจ๊ป ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.