๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ŒCS/DB

[DB] Connection Pool

by dar0m! 2021. 4. 18.

๊ฐœ๋…

DBCP(Database Connection Pool)์€ ๋‹ค์ˆ˜์˜ HTTP ์š”์ฒญ์— ๋Œ€ํ•œ Thread๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. (WAS์™€ DB ์„œ๋ฒ„๊ฐ„ ์ด์Šˆ)

Connection Pool์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  WAS์—์„œ DB์„œ๋ฒ„์— ์ ‘๊ทผ์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋‹จ๊ณ„

  1. DB ์„œ๋ฒ„ ์ ‘์†์„ ์œ„ํ•ด JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋กœ๋“œํ•œ๋‹ค.
  2. DB ์ ‘์† ์ •๋ณด์™€ DriverManager.getConnection() Method๋ฅผ ํ†ตํ•ด DB Connection ๊ฐ์ฒด๋ฅผ ์–ป๋Š”๋‹ค.
  3. Connection ๊ฐ์ฒด๋กœ ๋ถ€ํ„ฐ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ PreparedStatement ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค.
  4. executeQuery๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋กœ ResultSet ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  5. ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋œ ๋ฆฌ์†Œ์Šค๋“ค์„ closeํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ HTTP ์š”์ฒญ์— ๋”ฐ๋ผ Thread๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์€ DB ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด DB์ ‘์†์„ ์œ„ํ•œ Driver๋ฅผ ๋กœ๋“œํ•˜๊ณ  Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์—ฐ๊ฒฐํ•œ๋‹ค๋ฉด ๋ฌผ๋ฆฌ์ ์œผ๋กœ DB ์„œ๋ฒ„์— ์ง€์†์ ์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ๋  ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ DB Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋น„์šฉ๊ณผ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์„ ์ค„์ผ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด DBCP(Database Connection Pool)์ด๋‹ค.

์ถœ์ฒ˜ : https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/

Connection Pool์˜ ๊ตฌํ˜„์ฒด์˜ ์—ญํ• 

  1. WAS๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ๋ฏธ๋ฆฌ ์ผ์ •๋Ÿ‰์˜ DB Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Pool ์ด๋ผ๋Š” ๊ณต๊ฐ„์— ์ €์žฅํ•ด ๋‘”๋‹ค.
  2. HTTP ์š”์ฒญ์— ๋”ฐ๋ผ ํ•„์š”ํ•  ๋•Œ Pool์—์„œ Connection ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  3. ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ HTTP ์š”์ฒญ ๋งˆ๋‹ค DB Driver๋ฅผ ๋กœ๋“œํ•˜๊ณ  ๋ฌผ๋ฆฌ์ ์ธ ์—ฐ๊ฒฐ์— ์˜ํ•œ Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ์ด ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค.

https://www.holaxprogramming.com/2013/01/10/devops-how-to-manage-dbcp/

 

์†์„ฑ

Connection Pool๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๊ฐ’๋“ค์€ DBCP ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์„ค์ • ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

Value Description
maxActive ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜
maxIdle Connection Pool์— ๋ฐ˜๋‚ฉํ•  ๋•Œ ์ตœ๋Œ€๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋Š” ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜
minIdle ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•  ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜
initialSize ์ตœ์ดˆ๋กœ getConnection() Method๋ฅผ ํ†ตํ•ด ์ปค๋„ฅ์…˜ ํ’€์— ์ฑ„์›Œ ๋„ฃ์„ ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜
  • maxActive >= initialSize
    • ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜๋Š” ์ดˆ๊ธฐ์— ์ƒ์„ฑํ•  ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • maxActive = maxIdle
    • maxActive ๊ฐ’๊ณผ maxIdle ๊ฐ’์€ ๊ฐ™์€ ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

maxActive ์†์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ปค๋„ฅ์…˜์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

10๋ช…์ด ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์— ๊ฐ‘์ž๊ธฐ 1000๋ช…์ด ๋™์‹œ์— ์ ‘๊ทผ์„ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์ปค๋„ฅ์…˜ ํ’€์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, 1000๊ฐœ์— ํ•ด๋‹นํ•˜๋Š” ์š”์ฒญ๋งˆ๋‹ค ์ปค๋„ฅ์…˜์„ ๋งŒ๋“œ๋Š๋ผ ์žฅ์• ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ปค๋„ฅ์…˜ํ’€์„ ์ด์šฉํ•˜๋ฉด, ์ปค๋„ฅ์…˜์„ ์ตœ๋Œ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ œํ•œ์ด ์ƒ๊ธฐ๊ฒŒ ๋˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

WAS์˜ Thread ์ˆ˜์™€ Connection Pool ์ˆ˜์˜ ๊ด€๊ณ„

WAS์—์„œ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์ด ๊ต‰์žฅํžˆ ๋งŽ์ง€๋งŒ, ๊ทธ ์ค‘ ๊ฐ€์žฅ ์„ฑ๋Šฅ์— ๋งŽ์€ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ถ€๋ถ„์€ Thread์™€ Connection Pool์˜ ๊ฐœ์ˆ˜ ์ด๋‹ค.

์ด๋“ค ๊ฐ’์€ ์ง์ ‘์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ํ•  ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ ์œ ํ•˜๊ฒŒ ๋˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์ง€์ •ํ•˜๋ฉด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

WAS์˜ Thread๋Š” Connection Pool์˜ ๊ฐฏ์ˆ˜๋ณด๋‹ค ์—ฌ์œ ์žˆ๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ด์œ ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”์ฒญ์ด DB์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Connection Pool์€ ์‹œ์Šคํ…œ์˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ๋ณดํ†ต 40~50๊ฐœ๋กœ ์ง€์ •ํ•˜๋ฉด Thread๋Š” ์ด๋ณด๋‹ค 10๊ฐœ ์ •๋„ ๋” ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ตœ์ ์˜ ์„ฑ๋Šฅ์˜ ์œ„ํ•ด์„œ๋Š” ์‹ค์ œ ์š”์ฒญ์ด ์–ผ๋งˆ๋‚˜ ๋“ค์–ด์˜ค๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋ฉฐ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•ž์„œ ๋งํ•œ๊ฒƒ ์ฒ˜๋Ÿผ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฐธ๊ณ 

 

'๐Ÿ“ŒCS > DB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[DB] ํŠธ๋žœ์žญ์…˜(Transaction)  (0) 2021.04.23
[DB] ์บ์‹œ, Redis  (0) 2021.04.18
[DB] ์ •๊ทœํ™”  (0) 2021.04.11
[DB] N + 1 ๋ฌธ์ œ  (0) 2021.04.11
[DB] Index  (1) 2021.04.04

๋Œ“๊ธ€