HikariCP คือ library (light-weight) การจัดการ connection ในการติดต่อ database เพื่อลดการสร้าง connection ใหม่ทุกครั้ง (cache connection)โดยเขาเคลมไว้ว่า “ zero-overhead ” (แน่นอนการการติดต่อ database บ่อยๆ มันมี cost ในเรื่อง memory, network, etc. ซึ่งไม่ค่อยจะดีนะ) แต่มันจะดีกว่าไหม ถ้าเรามี connection อยู่ แล้วเราสารมารถนำมา reuse ได้ ว่าเเต่มันทำงานอย่างไรมาดูกัน
หลักการทำงาน
1. Client ส่งคำขอร้อง connection
2. ทำการค้นหา connection ใน pool (pool คือที่รวบรวม connection ที่ cache เก็บไว้) ว่ามีไหม หากมี connection อยู่แล้วมันจะหยิบเอาไปใช้ (ซึ่งตรงนี้มันจะต้องเช็คก่อนด้วย ว่า connection นั้น มันอยู่ใน status อะไร หากอยู่ใน status idle (ว่าง) มันจะหยิบไปใช้ หากอยู่ในสถานะ active (มีคนใช้อยู่) มันจะรอจนกว่าใน pool จะมี connection ให้ใช้ได้ จะอยู่สถานะ waiting)
3. แต่หากไม่มี connection อยู่ มันก็จะทำการสร้าง connection ใหม่
4. มันทำการติดต่อกับ database เพื่อทำการสร้าง connection
5. ติดต่อกับ database สำเร็จ เพื่อทำการสร้าง connection
6. สร้าง connection object
7. นำเอา connection ใหม่ยัดกลับไปใน pool
8. ทำการหยิบ connection ไปใช้งาน
ทีนี้พอจะเข้าใจหลักการทำงานคร่าวๆขอมันแล้ว… ว่าเเต่สิ่งสำคัญที่สุดในการใช้ connection ก็คือ เมื่อคุณใช้ connection แล้วอย่าลืม close มันด้วย เพื่อที่ให้ Hikari รู้ว่าใช้งานเสร็จเเล้ว ตูจะได้ยัดกลับไปใน pool ให้คนอื่นได้ใช้บ้าง!!
หากคุณใช้ JDBC Template แล้วเมื่อใช้งานเสร็จมันจะปิด connection ให้เอง แต่กรณีที่คุณใช้วิธีการ connection มาตรงๆ ก็ close ให้มันด้วยหลังใช้งานเสร็จ เช่น Connection conn = hikariDataSource.getConnection(); แบบนี้ละก็ต้องปิด connection ให้มันด้วย โดยใช้ conn.close();
แน่นอนว่านี้การเป็นเล่าคร่าวๆ มันยังมี setting HikariCP อีกมากหมาย เช่น สามารถกำหนด maximumPoolSize, minimumIdle, maxLifetime, idleTimeout, connectionTimeout ซึ่งลองไปอ่านต่อได้ที่ลิ้งด้านล่าง และที่สำคัญจงคำนวณ pool size ให้ดีๆ นึกถึง concurrent หากมี idle connection ไม่พอใช้จากที่เรากำหนดไว้ มันจะทำการ waiting เพื่อรอ connection ซึ่งจะเกิดเคส timeout
Configuration ที่ใช้บ่อยที่สุด
- connectionTimeout คือ ระยะเวลามากที่สุด (milliseconds) Default: 30,000 (30 seconds) ที่ผู้ร้องขอสามารถรอ connection จาก pool ได้ หากเกินเวลานี้ก็จะ throw exception
- idleTimeout คือ ระยะเวลามากที่สุด (milliseconds) Default: 600,000 (10 minutes) ที่กำหนด idle connection ที่จะอยู่ใน pool ได้ (หมายเหตุ idleTimeout setting นี้จะมีผลก็ต่อเมื่อ minimumIdle ที่กำหนดน้อยกว่า maximumPoolSize ที่กำหนด)
- keepaliveTime คือ ระยะเวลาความถี่ที่ hikariCP จะใช้เช็ค idle connection ที่อยู่ใน pool ว่ายังสามารถติดต่อกับ database ได้อยู่หรือป่าว (หมายเหตุ keepaliveTime ควรน้อยกว่า maxLifeTime) หากถึงเวลาที่กำหนดไว้มันจะทำการ ลบ idle connection ออกจาก pool และทำการ ping เพื่อเช็คว่ายังต่อกับ database ได้อยู่ไหม ถ้าได้มันก็จะ return connection กลับไปใน pool
- maxLifetime คือ ระยะเวลามากที่สุดที่ idle connection จะมีชีวิตอยู่ใน pool ได้ Default: 1800000 (30 minutes) หากถึงเวลาที่กำหนดมันจะทำการ close connection เดิมทิ้งและ add connectionใหม่
- connectionTestQuery คือ query statement ที่ใช้สำหรับเทสเช็ค connection ว่ามันสามารถติดต่อกับ database ได้หรือไม่ Default: none ซึ่ง query ที่เรากำหนดนี้มันจะ execute เช็คตอนที่มันกำลังหยิบ connection จาก pool ให้เรา
- minimumIdle คือ จำนวนน้อยที่สุดที่จะยอมให้มี idle connection อยู่ใน pool ได้ (หมายเหตุ minimumIdleควรน้อยกว่า maximumPoolSize) Default: same as maximumPoolSize โดยเราเริ่ม application แล้วนั้น hikariCP จะทำการสร้าง idle connection ให้เรารอใน pool ตามที่เรากำหนดค่านี้ เพื่อเพิ่ม connections quickly and efficiently เช่นตั้งค่า maximumPoolSize: 100 และ minimumIdle: 50 ตอนเริ่ม app มันก็สร้าง idle connection มาให้เราพร้อมใช้งานเลย 50 connections
- maximumPoolSize คือ จำนวนมากที่สุดที่ pool จะสามารถเก็บ connection ได้ ซึ่งมันจะนับรวม สถานะ idle และ active ด้วย
- poolName คือใช้สำหรับกำหนดชื่อ pool เอาไว้ใช้ดูตอน logging Default: auto-generated
หากใครจะให้ spring boot แสดง log การทำงานของ hikari เพื่อโชว์ stats ให้เพิ่มในส่วนนี้เข้าไปใน logback.xml ของท่าน
หากผิดพลาดประการใดขออภัยไว้ล่วงหน้าครับ 🙏🏻