Connection Pool: ทำไมต้องสร้างสะพานข้ามแม่น้ำใหม่ทุกครั้งที่ลูกค้าสั่งกะเพรา?
⏱️ ใช้เวลาอ่านประมาณ: 4 นาที 30 วินาที
เคยสงสัยไหมว่า เวลาเขียนโค้ดคิวรี่ข้อมูลง่ายๆ แค่
SELECT * FROM users WHERE id = 1
ซึ่งตัวฐานข้อมูลใช้เวลาประมวลผลแค่ 1 มิลลิวินาที...
แต่ทำไมหน้าเว็บถึงหมุนติ้วเกือบ 100 มิลลิวินาที?
เวลาอีก 99 มิลลิวินาทีมันหายไปไหนในมิติลี้ลับ? คำตอบไม่ได้อยู่ที่ SQL แต่เกิดจาก "ค่าใช้จ่ายในการเปิดประตูบ้าน" ที่แพงหูฉี่จนระบบแทบพัง
🌉 พิธีรีตองก่อนส่งข้าว 1 จาน
สมมติว่าเซิร์ฟเวอร์แอปของคุณอยู่ฝั่งธนฯ และ Database อยู่ฝั่งพระนคร
ถ้าคุณเขียนโค้ดแบบดิบๆ สั่ง
DriverManager.getConnection() ทุกครั้งที่มี Request
วิ่งเข้ามา สิ่งที่เกิดขึ้นหลังบ้านคือ:
- TCP Three-Way Handshake: ตะโกนทักทายข้ามเครือข่าย SYN ➔ SYN-ACK ➔ ACK (กินไปแล้ว 3 เที่ยว)
- TLS/SSL Handshake: แลกใบรับรอง แลกกุญแจเข้ารหัสลับ ยืนยันตัวตนกันอีกหลายรอบ
- DB Authentication: ส่ง Username/Password ไปเช็ก ตรวจสอบสิทธิ์ว่ามีตารางนี้ไหม
- Allocate Memory: Database ต้องเจียด Process และหน่วยความจำมารับรองแขกคนนี้โดยเฉพาะ
ทำพิธีสารพัดอย่างหมดเวลาไป 80-100ms เพียงเพื่อจะยิงคำสั่ง
SELECT ที่ใช้เวลาทำงานจริง
1ms แล้วคุณก็สั่ง
connection.close() ทุบสะพานทิ้งทันที!
ถ้ามีคนสั่งข้าว 1,000 คนพร้อมกัน เซิร์ฟเวอร์คุณไม่ได้ล่มเพราะทำกับข้าวไม่ทัน แต่ล่มเพราะ มัวแต่ก่อสร้างสะพานแล้วทุบทิ้งวนไปพันรอบ
🏊♂️ อภินิหารสระว่ายน้ำ: Connection Pool & HikariCP
มนุษย์เลยคิดวิธีที่ฉลาดกว่านั้น: "ทำไมเราไม่สร้างสะพานทิ้งไว้ล่วงหน้าสัก 10 สาย แล้วให้ทุกคนผลัดกันเดินข้ามล่ะ?"
"Connection Pool คือการเปิดท่อค้างไว้ล่วงหน้าในสระ เมื่อใครจะใช้
ก็แค่เดินมาหยิบไป พอใช้เสร็จสั่ง close() มันจะไม่ปิดจริง
แต่จะถูกโยนกลับคืนลงสระให้คนถัดไปหยิบต่อทันที"
และในโลก Java ยุคปัจจุบัน ราชาที่ครองสังเวียนนี้แบบเบ็ดเสร็จเด็ดขาดคือ HikariCP (คำว่า Hikari ในภาษาญี่ปุ่นแปลว่า "แสง") ซึ่งเร็วขนาดที่ Spring Boot เลือกให้เป็นค่าเริ่มต้นอัตโนมัติ
ทีมผู้สร้าง HikariCP บ้าคลั่งความเร็วถึงขนาด:
-
ไม่ใช้
ArrayListธรรมดา แต่เขียนคลาสFastListขึ้นมาเองเพื่อตัดการเช็ก Index Range ซ้ำซ้อน - ปรับแต่ง Bytecode ระดับไมโคร เพื่อให้โค้ดฟิตพอดีกับ L1/L2 CPU Cache ของเครื่อง
- ทำให้การยืม Connection จาก Pool ใช้เวลาลดลงเหลือระดับ นาโนวินาที (Nanoseconds)
💡 5-Min Takeaway
"สิ่งที่แพงที่สุดในระบบ Network มักไม่ใช่การส่งข้อมูล
แต่คือการเริ่มสร้างสายสัมพันธ์ (Connection Handshake)"
การเข้าใจ Connection Pool ทำให้เรารู้ว่าการตั้งค่า
maximum-pool-size ไม่จำเป็นต้องใหญ่เป็นร้อย (ส่วนใหญ่
10–20 ก็พอสำหรับรองรับหมื่น Request) เพราะหัวใจคือ
หมุนเวียนของเร็ว ไม่ใช่กักตุนของเยอะ