์น ์ปจํ ์ด๋(WAS)๊ฐ ์คํ๋๋ฉด์ Database์ ์ฐ๊ฒฐ๋ Connection์ ๋ฏธ๋ฆฌ ์์ฑํ์ฌ pool์ ์ ์ฅํด๋์๋ค๊ฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์ค๋ฉด ํด๋น Connection ์ ์ฌ์ฉํ๊ณ , ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ๋ค์ ๋ฐํํ๋ Connection์ ๋ฐ๋ฉ๋ฐ์ pool์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
Connection
๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ก, Connetion์ด ์์ฑ๋ ๋๋ง๋ค ์์คํ ์ ์์(CPU, ๋ฉ๋ชจ๋ฆฌ)์ ๋ง์ ์๋ชจ์ ์๊ฐ์ด ๋ฐ์ํ๋ค.
- HTTP ์์ฒญ : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ด DBMS ์์ ์ ์ํํด์ผํ๋ ๊ฒฝ์ฐ๋ก ์ดํดํ์.
- Connection ์์ฒญ ๋ฐ์
- Connection Pool์ ์กด์ฌํ๋ Connection ์ ์ ๊ณต
- Connection ์ฌ์ฉ
- Connection ์ฌ์ฉ ์ข ๋ฃ
- ์ฌ์ฉ์ด ๋๋ Connection ์ ๋ค์ Connection Pool ์ ๋ฐํ
T, C ์ ์๋ฏธ๋?
- T : ํ์ฌ ์๊ฐ์ ๋ด๊ณ ์๋ ํ์ ์คํฌํ
- C : ์ปค๋ฅ์ ์ ๋ ํผ๋ฐ์ค
commons.dbcp ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- PoolableConnection ํ์ ์ ์ปค๋ฅ์ ์ ์์ฑํ๊ณ ์์ฑํ ์ปค๋ฅ์ ์ ConnectionEventListener ๋ฑ๋ก
- ConnectionEventListener ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉํ ์ปค๋ฅ์ ์ ํ๋ก ๋ฐํํ๊ธฐ ์ํด ํธ์ถ๋ ์ฝ๋ฐฑ ๋ฉ์๋๊ฐ ์๋ค.
- ์ด๋ ๊ฒ ์์ฑ๋ ์ปค๋ฅ์ ์ด ์ปค๋ฅ์ ํ์ ์ถ๊ฐ๋๋ค.
- ์ด๋ commons-pool์ ๋ด๋ถ์ ์ผ๋ก ํ์ฌ ์์์ ๋ด๊ณ ์๋ ํ์์คํฌํ์ ์ถ๊ฐ๋ ์ปค๋ฅ์ ์ ๋ ํผ๋ฐ์ค๋ฅผ ํ์์ผ๋ก ํ๋ ObjectTimestampPair๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ค.
- ์ด๋ค์ LIFO(Stack) ํํ์ CursorableLinkedList ๋ก ๊ด๋ฆฌํ๋ค. (๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐฉ์)
์ต์ | ์ค๋ช |
---|---|
maxActive | ๋์์ ์ฌ์ฉํ ์ ์๋ ์ต๋ ์ปค๋ฅ์ ๊ฐ์ |
maxIdle | Connection Pool์ ๋ฐ๋ฉํ ๋ ์ต๋๋ก ์ ์ง๋ ์ ์๋ ์ปค๋ฅ์ ๊ฐ์ |
minIdle | ์ต์ํ์ผ๋ก ์ ์งํ ์ปค๋ฅ์ ๊ฐ์ |
initialSize | ์ต์ด๋ก getConnection() Method๋ฅผ ํตํด ์ปค๋ฅ์ ํ์ ์ฑ์ ๋ฃ์ ์ปค๋ฅ์ ๊ฐ์ |
maxWait | ์ปค๋ฅ์ ์ ์ป๊ธฐ ์ ์ต๋ ๋๊ธฐ ์๊ฐ |
- maxActive ๋ initialSize ๋ณด๋ค ๋ ํฌ๊ฑฐ๋ ๊ฐ์์ผํ๋ค.
- maxActive = 10์ด๊ณ initialSize = 20์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์ต์ด์ ์ปค๋ฅ์ ์ ์์ฑํ ๋ initialSize ๊ฐ์ด ์ต๋ ์ปค๋ฅ์ ๊ฐ์์ธ maxActive ๊ฐ๋ณด๋ค ์ปค์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ค๋ฅ๊ฐ ์๋ ์ค์ ์ด๋ค.
- ์ฌ๊ธฐ์ initialSize ์ ์ฌ์ฉ์ค์ธ Connection ๊ฐ์ฒด๋ก ๋ณด์.
- maxActive ์ maxIdle ์ ๋์ผํ๊ฒ ์ค์ ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
( 2)๋ฒ ์์ ์ํฉ )
maxActive = 10์ด๊ณ , maxIdle = 5์ธ ๊ฒฝ์ฐ
๋์์ ์ฌ์ฉํ ์ ์๋ ์ต๋ ์ปค๋ฅ์ ๊ฐ์๊ฐ 10๊ฐ์ธ๋ฐ, ํญ์ ์ปค๋ฅ์ ์ ๋์์ 5๊ฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ 1๊ฐ์ ์ปค๋ฅ์ ์ด ์ถ๊ฐ๋ก ์์ฒญ๋๋ค๋ฉด 10๊ฐ๊น์ง ๊ฐ๋ฅํ๋ฏ๋ก ํ๋์ Connection์ ์์ฑํ์ฌ ์ถ๊ฐํ๊ณ , ์ด Connection์ ์์ฒญ์ด ๋๋ ํ ๋ค์ pool์ ๋ณด๊ด๋๋ค. ์ด๋ maxIdel์ด 5์ด๋ฏ๋ก ํด๋น ์ปค๋ฅ์ ์ close ๋์ด, ์ด๋ฐ ์ํฉ์ด ๋ฐ๋ณต๋๋ฉด ๋งค๋ฒ Connection์ ์์ฑํ๊ณ ๋ซ๋ ๋น์ฉ์ด ๋ฐ์ํ ์ ์๋ค.
(์์) Hikari CP : https://brunch.co.kr/@jehovah/24
Connection Pool์ ๊ด๋ฆฌํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
(1๋ฒ)
- ์์ฒญ์ด ๋ฐ์ํ์ฌ, Connection Pool์ Connection ์ ๋ฐํํ๋ค. ์ด์ ์ ์ฌ์ฉํ๋ Connection์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ์ด๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ฐํํ๋ค.
(2๋ฒ)
- ๊ฐ๋ฅํ Connection์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, HandOffQueue๋ฅผ Polling ํ๋ฉด์ ๋ค๋ฅธ Thread๊ฐ Connection์ ๋ฐ๋ฉํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. ๋ง์ฝ ์ต๋ ๋๊ธฐ์๊ฐ ์ค์ ๊ฐ (maxWait)๋ณด๋ค ์ง๋๊ฒ๋๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.
Polling ์ฃผ๊ธฐ์ ์ผ๋ก Connection Pool์ ์ํ๋ฅผ ๊ฒ์ฌํ์ฌ HandOffQueue์ ๋๊ธฐํํ๋ค.
(3๋ฒ)
- ์ต์ข ์ ์ผ๋ก ์ฌ์ฉํ Connection์ ๋ฐ๋ฉํ๋ฉด Connection Pool์ด Connection ์ฌ์ฉ ๋ด์ญ์ ๊ธฐ๋กํ๊ณ HandOffQueue์ ๋ฐ๋ฉ๋ Connection์ ์ฝ์ ํ๋ค.
** ๋ง์ฝ ์ปค๋ฅ์ ํ์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด?
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ฐ์ํ ๋ ๋ง๋ค Connection ์ ์์ฑํด์ค์ผํ๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํด๋ณด์. ์ด๋ ๊ฒ๋๋ฉด ์์ฒญ์ด ์ฌ๋๋ง๋ค ๊ณ์ํด์ ์๋ก์ด Connection ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉฐ, Conenction์ ์์ฑํ๊ณ ์ญ์ ํ๋ ๋น์ฉ์ด ๋ฐ์ํ๊ฒ๋๋ค.
- ์ปค๋ฅ์ ํ์ ๋ฏธ๋ฆฌ Connection ๋ค์ ์์ฑํ์ฌ ์ ์ฅํ๋ฏ๋ก, ์ปค๋ฅ์ ์ด ํ์ํ ์์ ์ ์์ฑํ๋ ์๊ฐ์ ์๋นํ์ง ์๋๋ค.
- ์์ฑ๋ Connection์ ๊ณ์ํด์ ์ฌ์ฌ์ฉํ์ฌ, ์์ฑ๋๋ ์ปค๋ฅ์ ์ ์๊ฐ ๋ง์ง ์๊ณ ์ง์ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
WAS์์ ์ค์ ํด์ผ ํ๋ ๊ฐ ์ค ๊ฐ์ฅ ์ฑ๋ฅ์ ๋ง์ ์ํฅ์ ์ฃผ๋ ๋ถ๋ถ์ ์๋์ ๊ฐ๋ค.
- Thread
- Connection Pool์ ๊ฐ์
์ด๋ค ๊ฐ์ ์ง์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์, ๋ง์ด ์ฌ์ฉํ๋ฉด ํ ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ ์ ํ๊ฒ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ๋ฐ๋๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ํด ์ ๊ฒ ์ง์ ํ๋ค๋ฉด, ์๋ฒ์์๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ๋๊ธฐ ํ ์ ๋ฐ์ ์๋ค.
DB Connection Pool ๊ด๋ฆฌ ๋ฐฉ๋ฒ
- ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ด์ ํ๊ฒฝ์์์ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์งํํ๋ ๊ฒ์ด๋ค. ํ ์คํธ๋ฅผ ์งํํ์ฌ ์์คํ ํ๊ฒฝ์ ์ต์ ํ๋ ๊ฐ์ ์ฐพ์๋ด๋๊ฒ ์ข๋ค.
- WAS์ Thread์ ๊ฐ์๊ฐ DB์ Connection Pool์ ๊ฐฏ์ ๋ณด๋ค ๋ง์์ผ ํ๋ ์ด์ ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๋ชจ๋ ์์ฒญ์ด DB์ ์ ๊ทผํ๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
https://programmer93.tistory.com/74
https://velog.io/@kchief/Connection-Pool%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80