0Pricing
Java Academy · บทเรียน

การรวมการเชื่อมต่อด้วย HikariCP

นำการเชื่อมต่อกลับมาใช้ใหม่อย่างมีประสิทธิภาพ

การรวมการเชื่อมต่อด้วย HikariCP เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องใช้พูลการเชื่อมต่อ

การเปิดการเชื่อมต่อฐานข้อมูลมีค่าใช้จ่ายสูง: การจับมือของ TCP การยืนยันตัวตน และการตั้งค่าเซสชันอาจใช้เวลาหลายสิบมิลลิวินาที

พูลการเชื่อมต่อจะเก็บการเชื่อมต่อที่เปิดอยู่จำนวนหนึ่งไว้ให้พร้อมใช้งาน โค้ดของคุณยืมการเชื่อมต่อมา ใช้งาน แล้วส่งคืน ซึ่งเปลี่ยนการเปิดการเชื่อมต่อที่มีค่าใช้จ่ายสูงให้เป็นการขอยืมที่มีค่าใช้จ่ายต่ำ

รู้จัก HikariCP

HikariCPคือพูลมาตรฐานโดยพฤตินัยสำหรับ Java มีขนาดเล็ก รวดเร็ว และเป็นค่าเริ่มต้นใน Spring Boot

ระบบนี้ทำตาม javax.sql.DataSource ดังนั้นโค้ดระบบเชื่อมต่อฐานข้อมูล Java ส่วนที่เหลือจึงยังเหมือนเดิม คุณเพียงดึงการเชื่อมต่อจากพูลแทนการใช้ DriverManager

การกำหนดค่าพูล

คุณกำหนดค่า HikariCP ด้วยออบเจ็กต์ HikariConfig ซึ่งประกอบด้วย URL ของการเชื่อมต่อฐานข้อมูล ข้อมูลรับรอง และขนาดพูล

จากนั้นจึงสร้าง HikariDataSource จากออบเจ็กต์ดังกล่าว โดยทั่วไปจะทำเพียงครั้งเดียวเมื่อแอปพลิเคชันเริ่มทำงาน แล้วใช้ร่วมกัน

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class Main {
    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/shop");
        config.setUsername("app");
        config.setPassword("secret");
        config.setMaximumPoolSize(10);
        HikariDataSource ds = new HikariDataSource(config);
        System.out.println("Pool ready, max size " + config.getMaximumPoolSize());
        ds.close();
    }
}

การยืมการเชื่อมต่อ

เรียก ds.getConnection() เพื่อยืมการเชื่อมต่อ แล้วครอบด้วย try-with-resources ตามปกติ

ประเด็นสำคัญคือ การปิดการเชื่อมต่อจากพูลไม่ได้ปิดซ็อกเก็ตจริง แต่จะส่งการเชื่อมต่อกลับไปยังพูลเพื่อใช้ซ้ำ

import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;

public class Main {
    public static void main(String[] args) {
        DataSource ds = new HikariDataSource();
        try (Connection conn = ds.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT count(*) FROM users");
             ResultSet rs = ps.executeQuery()) {
            if (rs.next()) System.out.println("Users: " + rs.getInt(1));
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

close() หมายถึงการคืนการเชื่อมต่อ

เรื่องนี้ทำให้นักพัฒนาหลายคนสับสน เมื่อใช้พูล:

  • conn.close() จะส่งการเชื่อมต่อกลับไปยังพูล
  • พูลจะเปิดซ็อกเก็ตจริงไว้สำหรับผู้ยืมคนถัดไป

ดังนั้นคุณควรปิดการเชื่อมต่อเสมอ — try-with-resources เป็นวิธีที่ถูกต้อง คุณกำลังส่งคืน ไม่ใช่ทำลาย

การกำหนดขนาดพูล

ใหญ่กว่าไม่ได้หมายความว่าดีกว่า พูลที่ใหญ่เกินไปจะทำให้ฐานข้อมูลรับภาระงานพร้อมกันมากเกินไป

คำแนะนำของ HikariCP คือใช้พูลขนาดเล็ก ซึ่งมักมีขนาดประมาณ (core_count * 2) + effective_spindle_count และมักทำงานได้ดีกว่าพูลขนาดใหญ่ maximumPoolSize คือขีดจำกัดสูงสุด ส่วน minimumIdle จะรักษาการเชื่อมต่อบางส่วนให้พร้อมใช้งาน

public class Main {
    public static void main(String[] args) {
        int cores = 4;
        int spindles = 1; // SSD-ish
        int recommended = (cores * 2) + spindles;
        System.out.println("Suggested max pool size: " + recommended);
    }
}

ระยะหมดเวลาสำคัญ

HikariCP มีระยะหมดเวลาที่ช่วยปกป้องแอปของคุณจากฐานข้อมูลที่ค้าง:

  • connectionTimeout — ระยะเวลาที่การยืมจะรอก่อนล้มเหลว (ค่าเริ่มต้น 30 วินาที)
  • idleTimeout — ระยะเวลาที่การเชื่อมต่อไม่ได้ใช้งานจะคงอยู่
  • maxLifetime — เกษียณการเชื่อมต่อเมื่อมีอายุถึงค่านี้ (ควรกำหนดให้ต่ำกว่าระยะหมดเวลาของฐานข้อมูลเอง)

การตรวจสอบการเชื่อมต่อ

เครือข่ายอาจทำให้การเชื่อมต่อหลุดโดยไม่แจ้งให้ทราบ ก่อนส่งการเชื่อมต่อออกไป HikariCP สามารถตรวจสอบความถูกต้องของการเชื่อมต่อได้

ไดรเวอร์ระบบเชื่อมต่อฐานข้อมูล Java รุ่นใหม่ใช้ Connection.isValid(timeout) และ HikariCP จะเรียกใช้โดยอัตโนมัติ คุณยังสามารถกำหนด connectionTestQuery สำหรับไดรเวอร์รุ่นเก่าที่ไม่มี isValid ได้

การตรวจจับการรั่วไหล

การรั่วไหลของการเชื่อมต่อเกิดขึ้นเมื่อโค้ดยืมการเชื่อมต่อมาแต่ไม่เคยปิด ในที่สุดพูลจะไม่มีการเชื่อมต่อเหลือ และการยืมทุกครั้งจะหมดเวลา

กำหนด leakDetectionThreshold (เช่น 20000 มิลลิวินาที) แล้ว HikariCP จะบันทึกร่องรอยการเรียกใช้งานสำหรับการเชื่อมต่อใดก็ตามที่ถูกถือไว้นานกว่าค่านี้ ซึ่งจะชี้ให้เห็นโค้ดที่เป็นต้นเหตุได้โดยตรง

หนึ่งพูลต่อแอป

สร้าง HikariDataSource เพียงครั้งเดียว แล้วใช้ซ้ำตลอดอายุการทำงานของแอปพลิเคชัน

การสร้างพูลใหม่สำหรับแต่ละคำขอจะทำลายจุดประสงค์ของพูล เพราะคุณต้องเสียค่าใช้จ่ายในการเริ่มต้นทุกครั้ง ให้ปิดพูลเฉพาะตอนปิดระบบด้วย ds.close()

การตรวจติดตามพูล

HikariCP เปิดเผยตัวชี้วัดขณะทำงาน เพื่อให้คุณตรวจดูสถานะของพูลได้

  • การเชื่อมต่อที่กำลังใช้งาน ไม่ได้ใช้งาน และทั้งหมด
  • เธรดที่กำลังรอการเชื่อมต่ออยู่

ระบบนี้ทำงานร่วมกับไมโครมิเตอร์ เมตริกดรอปวิเซิร์ด และ JMX จำนวนรายการที่กำลังรอสูงอย่างต่อเนื่องหมายความว่าพูลมีขนาดเล็กเกินไป หรือการเชื่อมต่อถูกถือไว้นานเกินไป

ตรวจสอบอย่างรวดเร็ว

เมื่อใช้ HikariCP การเรียก close() กับการเชื่อมต่อที่ยืมมาจะทำอะไร

สรุปทบทวน

HikariCP ทำให้การใช้การเชื่อมต่อซ้ำมีประสิทธิภาพ:

  • กำหนดค่า HikariDataSource เพียงครั้งเดียวเมื่อเริ่มทำงาน
  • ยืมด้วย getConnection() ภายใน try-with-resources โดย close() จะส่งการเชื่อมต่อกลับไปยังพูล
  • กำหนด maximumPoolSize ให้พอเหมาะ
  • ปรับ connectionTimeout, maxLifetime และการตรวจสอบความถูกต้อง
  • ใช้ leakDetectionThreshold เพื่อตรวจจับการเชื่อมต่อที่ไม่ได้ส่งคืน

คำถามที่พบบ่อย

บทเรียน “การรวมการเชื่อมต่อด้วย HikariCP” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การรวมการเชื่อมต่อด้วย HikariCP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การรวมการเชื่อมต่อด้วย HikariCP”

นำการเชื่อมต่อกลับมาใช้ใหม่อย่างมีประสิทธิภาพ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การรวมการเชื่อมต่อด้วย HikariCP” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน JDBC
  2. PreparedStatement
  3. ธุรกรรม
  4. การรวมการเชื่อมต่อด้วย HikariCP
← กลับไปที่ Java Academy