DB ์ปค๋ฅ์ ํ(Connection Pool)๊ณผ Hikari CP
์๋ก
HikariCP๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ ๋ฐ ์์ด, ๊ฐ์ฅ ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด Connection Pool ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ ๋๋ค. ์ด๋ฒ ๊ฒ์๊ธ์์๋ Connection Pool๊ณผ Hikari CP์ ๋ํด ํ๋ฒ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
๋ชฉ์ฐจ
- ์ ํต์ ์ธ WAS์ DB ์ฐ๊ฒฐ ๋ฐฉ๋ฒ
- Connection Pool์ด๋?
- Connection Pool์ ๋ฌด์์ ํฌ๊ฒ ๋ง๋ค๋ฉด ์ฑ๋ฅ์ด ์ข์์ง๊น?
- ์ด์์ ์ธ Connection Pool์ ํฌ๊ธฐ๋ ์ผ๋ง์ผ๊น?
- Hikari CP๋?
์ ํต์ ์ธ WAS์ DB ์ฐ๊ฒฐ ๋ฐฉ๋ฒ
์ผ๋ฐ์ ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ CRUD์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ฐ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ ์ด๋ฏธ์ง์ ๊ฐ์ด DB์ ์ง์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ๋งค๋ฒ ๋๋ผ์ด๋ฒ(Driver)๋ฅผ ๋ก๋ํ๊ณ connection ๊ฐ์ฒด๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class Test {
public static void main(String[] args) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
Connection conn = null;
Statement statement = null;
String sql = "";
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, "master", "master");
statement = conn.createStatement();
sql = "select * from Table";
statement.execute(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
conn.close();
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ ์ดํด๊ฐ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด sql์ ์ํํ๊ธฐ ์ํด ๋๋ผ์ด๋ฒ(Driver)๋ฅผ ๋ก๋ํ๊ณ connection ์ํํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ง๊ธ์ด์ผ ์ฟผ๋ฆฌ๊ฐ ํ๋๋ผ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋๋ ์ถ์ง๋ง ๋งค๋ฒ ๋ชจ๋ ์์ฒญ๋ง๋ค ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ์ด๋จ๊น์?
์ผ๋ฐ์ ์ผ๋ก WAS(Web Application Server)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์๋ ๋ง์ ๋น์ฉ์ด ๋ญ๋๋ค. ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด MySQL 8.0 ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก INSERT๋ฌธ์ ์ํํ๋๋ฐ ๋๋ ๋น์ฉ์ ๋น์จ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Connecting: (3)
- Sending query to server: (2)
- Parsing query: (2)
- Inserting row: (1 × size of row)
- Inserting indexes: (1 × number of indexes)
- Closing: (1)
๊ฐ ๊ดํธ์ ์ซ์๋ ์๋์ ์ธ ๋น์ฉ์ ๋๋ต์ ์ธ ๋น์จ์ ์๋ฏธํ๋ฉฐ, ์ ๋ณด๋ฉด Connecting ์ฆ ์๋ฒ์ DB๊ฐ ์ฐ๊ฒฐํ๋๋ฐ ๊ฐ์ฅ ํฐ ๋น์ฉ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋น์ฉ ์ค์์๋ ์ฐ๊ฒฐ์ด ๊ฐ์ฅ ๋น์จ์ด ํฐ ์ด์ ์ค ํ๋๋ Database๋ ์ต์ด ์ ์ ์ TCP ํต์ ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.(๋คํธ์ํฌ ๋ ๋ฒจ์ด๋ผ ๊ฐ๋จํ๊ฒ๋ง ์ค๋ช ํ๊ฒ ์ต๋๋ค.)
TCP๋ก ํต์ ํ๋ ํ๋ก๊ทธ๋จ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ ์ ์ ํํ ์ ์ก์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์ด๋ฏธ์ง์ ๊ฐ์ด 3-way-handshake๋ผ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
๋ํ ๋ฐ์ดํฐ์ ์ ์ก์ด ์ข ๋ฃ๋๋ฉด ์ฌ์ฉํ ๋ฆฌ์์ค๋ฅผ ๋ฐํํ๊ธฐ ์ํ 4-way-handshake๊ณผ์ ๋ ์ํํฉ๋๋ค.
๋ชจ๋ ๊ณผ์ ์ ์์ฝํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ DB ๋๋ผ์ด๋ฒ๋ฅผ ํตํด ์ปค๋ฅ์ ์ ์กฐํํ๋ค.
- DB ๋๋ผ์ด๋ฒ๋ DB์ TCP/IP ์ปค๋ฅ์ ์ ์ฐ๊ฒฐํ๋ค. ๋ฌผ๋ก ์ด ๊ณผ์ ์์ 3-way-handshake ๊ฐ์ TCP/IP ์ฐ๊ฒฐ์ ์ํ ๋คํธ์ํฌ ๋์์ด ๋ฐ์ํ๋ค.
- DB ๋๋ผ์ด๋ฒ๋ TCP/IP ์ปค๋ฅ์ ์ด ์ฐ๊ฒฐ๋๋ฉด, ID, PW์ ๊ธฐํ ๋ถ๊ฐ์ ๋ณด๋ฅผ DB์ ์ ๋ฌํ๋ค.
- DB๋ ID, PW๋ฅผ ํตํด ๋ด๋ถ ์ธ์ฆ์ ์๋ฃํ๊ณ ๋ด๋ถ์ DB ์ธ์ ์ ์์ฑํ๋ค.
- DB๋ ์ปค๋ฅ์ ์์ฑ์ด ์๋ฃ๋์๋ค๋ ์๋ต์ ๋ณด๋ธ๋ค.
- DB ๋๋ผ์ด๋ฒ๋ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ํด๋ผ์ด์ธํธ์ ๋ฐํํ๋ค.
์ ํต์ ์ธ ๋ฐฉ๋ฒ์ ์ปค๋ฅ์ ์ ์๋ก ๋ง๋๋ ๊ณผ์ ๊ณผ DB๋ ๋ฌผ๋ก ์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์๋ TCP/IP ์ปค๋ฅ์ ์ ์๋ก ์์ฑํ๊ธฐ ์ํ ๋ฆฌ์์ค๋ฅผ ๋งค๋ฒ ์ฌ์ฉํด์ผ ํ๊ธฐ์ ์ค์ ์๋น์ค์ ์๋ต์๋์ ์ํฅ์ ๋ง์ด ๋ผ์น๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ์ ์ ๋ณด์ํ๊ธฐ ์ํด Connection Pool์ด๋ ๊ฐ๋ ์ด ๋์์ต๋๋ค.
Connection Pool์ด๋?
WAS(์น ์ปจํ ์ด๋)๊ฐ ์คํ๋ ๋ DB์ฐ๊ฒฐ์ ์ํด ๋ฏธ๋ฆฌ ์ผ์ ์์ connection ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด Pool์ ๋ด์ ๋๋ค๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ฐ์ํ๋ฉด Pool์์ ์์ฑ๋์ด ์๋ Connection ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด Connection ๊ฐ์ฒด๋ฅผ ๋ค์ Pool์ ๋ณด๊ดํ๋ ๋ฐฉ์์ ๋ปํฉ๋๋ค.
์ฆ, ์ปค๋ฅ์ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋ ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด pool์ ๋ณด๊ดํ ๋ค์ ํ์ํ ๋๋ง๋ค ์ปค๋ฅ์ ํ์ ์ปค๋ฅ์ ์ ์ด์ฉํ๊ณ ๋ฐํํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
Connection ํ์ ์ฌ์ฉํด์ ์ป์ ์ ์๋ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ฌ์ค๋ค.
Java์์๋ DB Connection์ ๋งบ๋ ๊ณผ์ ์ด ๋ถํ๊ฐ ๋ง์ด ๊ฑธ๋ฆฌ๋ ์์ ์ด๋ผ ๋์์ ๋ง์ ์ฌ๋๋ค์ด DB ์ปค๋ฅ์ ์ ์๊ตฌํ๋ค๋ฉด ์ต์ ์ ๊ฒฝ์ฐ ์๋ฒ๊ฐ ์ฃฝ์ด๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ Connection์ ์์ฑํ๊ณ ์ฌํ์ฉํ์ฌ ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
2. ์๋ฒ์ ํ์ ์ ์ธ ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
์๋ฒ๋ ํ์ ์ ์ธ ์์์ ๊ฐ์ง๊ณ ์๋๋ฐ ์์ฒญ์ด ์ฌ ๋๋ง๋ค ๋ฌด์ ํ์ Connection์ ์์ฑํ๊ฒ ๋๋ค๋ฉด ์ ์ฒด ์์คํ ์ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ปค๋ฅ์ ํ์ ๋ฏธ๋ฆฌ ์ ํด์ง ์ซ์์ Connection๋ง ์์ฑํ๋๋ก ์ ํํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ๊ธฐ์ Connection Pool์ ๋ฌด์์ ํฌ๊ฒ ๋ง๋ค๋ฉด ์ฑ๋ฅ์ด ์ข์์ง๊น? ํ๋ ์๋ฌธ์ด ์๊ธธ ์ ์์ต๋๋ค.
Connection Pool์ ๋ฌด์์ ํฌ๊ฒ ๋ง๋ค๋ฉด ์ฑ๋ฅ์ด ์ข์์ง๊น?
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ๋ฌด์์ Connection Pool์ ๋๋ฆฐ๋ค๊ณ ์ฑ๋ฅ์ด ์ข์์ง์ง๋ ์์ต๋๋ค.
๋จผ์ WAS์ DB์ ์ฐ๊ฒฐ์ thread๊ฐ ๋ด๋นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ thread ๋ํ thread pool์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ง์ฝ Thread Pool์ ํฌ๊ธฐ๋ณด๋ค Connection Pool์ ํฌ๊ธฐ๊ฐ ๋ ํฌ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์์ ๋จ์ Connection์ ์์ ์ ํ์ง ๋ชปํ๊ณ ๋๊ฒ ๋๊ธฐ์, ์ค์ง์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ง ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ Connection Pool์ ํฌ๊ฒ ํ๋๋ผ๋ thead pool์ ํฌ๊ธฐ๋ณด๋ค ์ปค๋ฒ๋ฆฌ๋ฉด ๋๊ฒ ๋๋ Connection Pool์ด ๋ง์์ง๊ธฐ ๋๋ฌธ์ ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๊ณ ๋ฌด์์ thread pool์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฐ๋ค๊ณ ํด๊ฒฐ๋์ง๋ ์์ต๋๋ค. thread์ ์ฆ๊ฐ๋ ๋ฌธ๋งฅ๊ตํ(Context Switching)์ผ๋ก ์ธํ ํ๊ณ๊ฐ ์กด์ฌํ๊ณ , Connection Pool์ ๋๋ ค์ ๋ง์ Thread๋ฅผ ๋ฐ์๋๋ผ๋ ๋ค์ํ ์์ธ์ผ๋ก ์ฑ๋ฅ์ ์ธ ํ๊ณ๊ฐ ์กด์ฌํฉ๋๋ค.
๋จผ์ , Disk ๊ฒฝํฉ ์ธก๋ฉด์์ ์ฑ๋ฅ์ ์ธ ํ๊ณ๊ฐ ์กด์ฌํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ๋ ๋์คํฌ ํ๋๋น ํ๋์ I/O๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ Blocking์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. SSD๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ถ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง ์ด ๋ํ ํ๊ณ๊ฐ ์กด์ฌํฉ๋๋ค. ์ฆ, ํน์ ์์ ๋ถํฐ๋ ์ฑ๋ฅ์ ์ธ ์ฆ๊ฐ๊ฐ Disk ๋ณ๋ชฉ์ผ๋ก ์ธํด ๋ฏธ๋นํด์ง๋๋ค.
๋ค์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ Context Switiching์ผ๋ก ์ธํ ์ฑ๋ฅ์ ์ธ ํ๊ณ๊ฐ ์กด์ฌํฉ๋๋ค.
Context Switching์ ๋ํด ๊ฐ๋จํ ์ดํด๋ณด๋ฉด ์ฐ๋ฆฌ๋ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ CPU๊ฐ ์ ์ญ, ์ ๋ฐฑ ๊ฐ์ Thread๋ฅผ ๋์์ ์คํํ ์ ์๋ค๊ณ ์๊ณ ์์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก CPU ์ฝ์ด๋ CPU์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๋์์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋น ๋ฅด๊ฒ ์ฌ๋ฌ ๊ฐ์ ์์ ์ context-swithing ํ๋ฉฐ ๋์ํ๊ธฐ ๋๋ฌธ์ ‘๋์์’ ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ๋ฟ์ ๋๋ค. ํ ๋ฒ์ ์์ ์ด ๋๋ ๋ค์์ Thread์ ์์ ์ ์ํํ๊ธฐ ์ํด context-switching์ด ์ผ์ด๋๋ฉฐ ์ด ์๊ฐ ์์ ์ ํ์ํ Thread์ Stack ์์ญ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ฑ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
CPU ์ค์ผ์ค๋ง์ ๋ํด์๋ ์ ํฌ์คํ ์ ์ฐธ๊ณ ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
- thread๋ Connection Pool์์ ์ ํด ์ํ์ธ DB Connection์ด ์กด์ฌํ๋ฉด ์ฌ์ฉํ๊ณ , ์์ฑํด์ผ ํ๋ค๋ฉด ์์ฑํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ DB Connection์ ์ด์ฉํด์ DB์์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ ๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
์ฆ, ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Connection pool์ ๋ฌด์กฐ๊ฑด ๋ง์ Connection๋ค์ ์์ฑํ๊ฒ ๋๋ฉด, Connection ์์ฒด๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค. (์ฑ๋ฅ ์ ํ)
- ๋ฐ๋๋ก Connetion pool์ Connection ๊ฐ์ฒด๊ฐ ๋๋ฌด ์ ์ผ๋ฉด ๋ง์ ์ ์ ๋ค์ด ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ฌ์ฉ ์ค์ธ Connection์ด ๋ฐ๋ฉ๋ ๋๊น์ง ๋๊ธฐํด์ผ ํ๋ ์๊ฐ์ด ๊ธธ์ด์ง๊ฒ ๋๋ค. (์ฑ๋ฅ ์ ํ)
- ๊ทธ๋ ๋ค๊ณ ๋ฌด์์ Thread Pool์ ๋๋ ค๋ Context Switiching์ผ๋ก ์ธํ ํ๊ณ๊ฐ ์กด์ฌํ๋ค.
์ด์์ ์ธ Connection Pool์ ํฌ๊ธฐ๋ ์ผ๋ง์ผ๊น?
๊ทธ๋ ๋ค๋ฉด ๊ณผ์ฐ ๊ฐ์ฅ ์ด์์ ์ธ Connection Pool์ ํฌ๊ธฐ๋ ์ผ๋ง์ผ๊น์?
๋จผ์ MySQL์ ๊ณต์๋ฌธ์์์๋ ์์ ๊ฐ์ด 600๋ช ์ ์ ์ ์ ๋ํด์ 15~20๊ฐ์ connection poolํฌ๊ธฐ๊ฐ ์ ๋นํ๋ค๊ณ ์ธ๊ธ๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด์๋ถํฐ๋ ์ ์ ํ๊ฒ ๋ถํ ํ ์คํธ๋ฅผ ์งํํ๋ฉฐ ์ ๋นํ ๊ฐ์ ์ง์ ์ฐพ๋ ๊ฒ์ ์ถ์ฒํ๊ณ ์์ต๋๋ค.
๋ค์์ผ๋ก ์ฐ์ํํ์ ๋ค์ ๊ธฐ์ ๋ธ๋ก๊ทธ์์๋ ์์ ๊ฐ์ pool size ๊ณต์์ ์ธ๊ธํ๊ณ ์์ต๋๋ค.
- Tn : ์ ์ฒด Thread ๊ฐ์
- Cm : ํ๋์ Task์์ ๋์์ ํ์ํ Connection ์
์ ๊ณต์์ HikariCP wiki๊ฐ ์๋ณธ ์ถ์ฒ์ด๋ฉฐ, ์ด ๊ณต์๋๋ก Maximum pool size๋ฅผ ์ค์ ํ๋ฉด Dead lock์ ํผํ ์ ์๋ค๊ณ ํฉ๋๋ค.
Hikari CP๋?
๊ทธ๋ ๋ค๋ฉด ์ด์ Hikari CP๋ ๋ฌด์์ผ๊น์?
HikariCP๋ 2012๋ ์ฒ์ ๊ฐ๋ฐ๋, 130kb์ ๊ฐ๋ฒผ์ด ์ฉ๋๊ณผ ๋น ๋ฅธ ์๋๋ฅผ ๊ฐ์ง๋ JDBC์ ์ปค๋ฅ์ ํ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ JDBC DataSource์ ๊ตฌํ์ฒด์ ๋๋ค.
๋ํ์ ์ธ ์ปค๋ฅ์ ํ ์คํ์์ค๋ก๋ common-dbcp2, tomcat-jdbc pool, HikariCP ๋ฑ์ด ์์ผ๋ฉฐ, Spring Boot 2.0 ์ด์ ๋ฒ์ ๊น์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก connection pool์ tomcat-jdbc pool์ ์ฌ์ฉํ์ง๋ง 2.0 ๋ฒ์ ์ดํ๋ถํฐ๋ HikariCP๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
HikariCP์ ๊นํ๋ธ์ ๋์์๋ ๋ค๋ฅธ ์คํ์์ค์ ๋น๊ตํ HikariCP์ ์ฑ๋ฅ์ ๋๋ค. ๊ต์ฅํ ๋ค๋ฅธ ์คํ์์ค๋ณด๋ค ๋น ๋ฅธ ๊ฒ์ ์ ์ ์์ต๋๋ค.
HikariCP๊ฐ ๋ค๋ฅธ CP ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณด๋ค ๋น ๋ฅธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: HikariCP๋ ๋งค์ฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ด๊ธฐํ ๋ฐ ์ฐ๊ฒฐ ์๊ฐ์ด ์งง๋ค.
- ๋์ ์ฒ๋ฆฌ๋: HikariCP๋ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ฐ๊ฒฐ์ ์์ฑํ๊ณ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ๋์ด ๋งค์ฐ ๋๋ค.
- ์์ ์ฝ๋ ๋ฒ ์ด์ค: HikariCP๋ ์ฝ๋ ๋ฒ ์ด์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฑ์ด ๊ฐ๋จํ๊ณ ๊ฐ๋ณ๋ค.
- ํ๋ถํ ๊ตฌ์ฑ ์ต์ : HikariCP๋ ๋ค์ํ ๊ตฌ์ฑ ์ต์ ์ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํ๋ ์ปค๋ฅ์ ํ์ ์์ฑํ ์ ์๋ค.
- ์ค๋ ๋ ์์ ์ฑ: HikariCP๋ ์ค๋ ๋ ์์ ํ๊ฒ ์ค๊ฒ๋์ด ์์ผ๋ฏ๋ก ์ฌ๋ฌ ์ค๋ ๋์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
Spring์์ Hikari์์ ์์ฃผ ์ฌ์ฉํ๋ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
spring:
datasource:
hikari:
driver-class-name: com.mysql.cj.jdbc.Driver
username: {id}
password: {password}
jdbc-url: jdbc:mysql://{url}:{port}/{db์คํค๋ง}
minimum-idle: 5
maximum-pool-size: 10
idle-timeout: 30000
pool-name: DevLogHikariCP
max-lifetime: 200000
connection-timeout: 30000
connection-test-query: /*CONNECTION TEST QUERY*/SELECT NOW() FROM DUAL
๊ฐ ์ค์ ๊ฐ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- minimum-idle: Connection Pool์ ์ ์ง ๊ฐ๋ฅํ ์ต์ ์ปค๋ฅ์ ๊ฐ์
- maximum-pool-size: Connection Pool์ ์ ์ง ๊ฐ๋ฅํ ์ต๋ ์ปค๋ฅ์ ๊ฐ์
- idle-timeout: Connection์ด Poll์์ ์ ํด์ํ(์ฌ์ฉํ์ง ์๋ ์ํ)๋ก ๋จ์ ์ ์๋ ์ต๋ ์๊ฐ
- pool-name: Connction Pool ์ด๋ฆ
- max-lifetime: Connection์ ์ต๋ ์ ์ง ๊ฐ๋ฅ ์๊ฐ
- connection-timeout: Pool์์ Connection์ ๊ตฌํ ๋ ๋๊ธฐ์๊ฐ, ๋๊ธฐ์๊ฐ์์ ๊ตฌํ์ง ๋ชปํ๋ฉด Exception
- connection-test-query: Connection์ด ์ ๋์๋์ง ํ์ธํ๋ TEST SQL
์ฐธ๊ณ
- https://programmer93.tistory.com/74
- https://velog.io/@rlacksals96/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPUDP%EC%99%80-3way-handshake
- https://velog.io/@hyun6ik/%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80-%EC%9D%B4%ED%95%B4
- https://1-7171771.tistory.com/119
- https://hyuntaeknote.tistory.com/12
- https://escapefromcoding.tistory.com/712